php 检查子类中的方法是不是被覆盖

Posted

技术标签:

【中文标题】php 检查子类中的方法是不是被覆盖【英文标题】:php check if method overridden in child classphp 检查子类中的方法是否被覆盖 【发布时间】:2013-07-13 20:16:56 【问题描述】:

是否可以检查一个方法是否被 php 中的子类覆盖?

<!-- language: lang-php -->

class foo 
    protected $url;
    protected $name;
    protected $id;

    var $baz;

    function __construct($name, $id, $url) 
        $this->name = $name;
        $this->id = $id;
        $this->url = $url;
    

    function createTable($data) 
        // do default actions
    

儿童班:

class bar extends foo 
    public $goo;

    public function createTable($data) 
        // different code here
    

当遍历定义为此类成员的对象数组时,如何检查哪些对象具有新方法而不是旧方法?有method_overridden(mixed $object, string $method name)这样的函数吗?

foreach ($objects as $ob) 
    if (method_overridden($ob, "createTable")) 
        // stuff that should only happen if this method is overridden
    
    $ob->createTable($dataset);

我知道template method pattern,但是假设我希望程序的控制与类和方法本身分开。我需要一个像method_overridden 这样的函数来完成这个。

【问题讨论】:

重载,还是被覆盖?我以为 PHP 没有方法重载 我的意思是被覆盖了,是的 你可以试试这个:php.net/manual/en/reflectionclass.hasmethod.php 如果您的设计依赖于了解类如何覆盖特定方法,那么您的设计就存在严重问题。 OO 背后的整个想法是,您可以向对象发送消息,并由对象以适当的方式处理它。调用代码不应该关心正在调用什么实现或如何处理它的消息。 【参考方案1】:

检查声明的类是否与对象的类匹配:

$reflector = new \ReflectionMethod($ob, 'createTable');
$isProto = ($reflector->getDeclaringClass()->getName() !== get_class($ob));

PHP 手册链接:

ReflectionMethod ReflectionProperty

【讨论】:

这当然是我想要的方式,但我有一个问题:你为什么在 ReflectionMethod 之前使用命名空间运算符?是否要确保从全局命名空间调用该方法,而不是意外调用在更局部范围内定义的同名方法? 您的情况可能不需要它。如果上面的代码位于命名空间下,则需要导入 ReflectionMethod 类,或者使用全局命名空间前缀 (`\`) 访问它。我只是确保这种情况得到处理:) 这也可以通过类属性来完成。只需改用\ReflectionProperty()【参考方案2】:

要获取此信息,您必须使用 ReflectionClass。您可以尝试 getMethod 并检查方法的类名。

$class = new ReflectionClass($this);
$method = $class->getMethod("yourMethod");
if ($method->class == 'classname') 
    //.. do something

但是请记住,反射不是很快,所以要小心使用。

【讨论】:

在 PHP 5.5.20 中,$method['class'] 给了我:不能使用 ReflectionMethod 类型的对象作为数组$method-&gt;class 工作得很好。

以上是关于php 检查子类中的方法是不是被覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 必须被子类覆盖的类方法

我想通过Python中的子类对象调用在子类中被覆盖的父类方法

Java中的覆盖和隐藏以及final关键字

Java-继承与覆盖摘抄

使用 inotify 检查监视文件夹中的文件是不是被覆盖

覆盖子类中的静态变量 swift 1.2