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

如何确定方法是继承的、重新定义的还是新的(PHP),php,inheritance,methods,Php,Inheritance,Methods,我想要一个函数来检查类是否定义了某个方法,类似于method\u exists,但类似于method\u defined($obj,'method\u name')。对于未继承的新方法,它应该返回true(这可以很好地检查方法是否在父类中定义,例如method\u存在($obj,$method)&&!method\u存在(get\u parent\u class($obj),$method)),对于重新定义的继承方法,它也应该返回true(不知道如何执行),但对于未重新定义(也不知道)的继承方法

我想要一个函数来检查类是否定义了某个方法,类似于
method\u exists
,但类似于
method\u defined($obj,'method\u name')。对于未继承的新方法,它应该返回true(这可以很好地检查方法是否在父类中定义,例如
method\u存在($obj,$method)&&!method\u存在(get\u parent\u class($obj),$method)
),对于重新定义的继承方法,它也应该返回true(不知道如何执行),但对于未重新定义(也不知道)的继承方法,返回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

最后,这是我用来作为解决方案的。它使用反射,但非常简单有效

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);
}

您可能会惊讶于moderm PHP中的反射实际上是多么不重要。。。。10年前它很重,但现在已经不是这样了,但是如果你想避免反射,看看,遍历继承树,根据需要依次检查每个父类。。。正如我在问题陈述中提到的,它可能比反射
get_class_方法
要重得多,它只适用于新定义的方法。无法区分从重新定义的方法继承的。至于思考不沉重,它可能是唯一的方式,这样更好。。。