如何确定方法是继承,重新定义还是新的(PHP)

时间:2017-03-18 17:27:07

标签: php inheritance methods

我想要一个函数来检查一个类是否定义了一个类似于method_exists的某个方法,但是像method_defined($obj, 'method_name');这样的东西,如果提到的方法存在则返回true并且它在obj中定义类本身,不是继承的。对于没有继承的新方法,它应该返回true(这可以很好地检查是否在父类中定义了方法,类似于method_exists($obj, $method) && !method_exists(get_parent_class($obj), $method)),对于重新定义的继承方法也是如此(不知道怎么做它),但对于未重新定义的继承方法(不知道)返回false。

示例代码:

<?php
class base
{
    var $x = 'x';
    function doit()
    {
        return $this->x;
    }
}

class a extends base
{
    function doit()
    {
        return 'a';
    }
}

class b extends base
{
    var $x = 'b';
}

class c extends base
{
}

function method_defined($obj, $method)
{
    return method_exists($obj, $method); // this is the question
}

function info($obj)
{
    echo get_class($obj) . ": " . $obj->doit();
    echo " " . (int)method_exists($obj, 'doit');
    echo " " . (int)is_subclass_of($obj, 'base');
    echo " " . (int)method_defined($obj, 'doit') . "\n";
}

info(new a); // a a 1 1 1
info(new b); // b b 1 1 0
info(new c); // c x 1 1 0
info(new base); // base x 1 0 1

我已经看过其他类似的问题了,但他们都为此回复了Reflection类,我想尽可能避免它,因为它很重。

提前致谢。

1 个答案:

答案 0 :(得分:0)

最后,这就是我用作解决方案的方法。它使用Reflection,但它非常简单有效。

function method_defined($ref, $method)
{
    $class = (is_string($ref)) ? $ref : get_class($ref);
    return (method_exists($class, $method)) && ($class === (new \ReflectionMethod($class, $method))->getDeclaringClass()->name);
}