父类php中的method_exists

时间:2010-07-22 10:42:33

标签: php parent-child

我正在尝试使用php函数method_exists,但我需要检查该方法是否存在于对象的父类中。

这样:

class Parent
{
    public function myFunction()
    {
        /* ... */
    }
}

class Child extends Parent
{
    /* ... */
}

$myChild = new Child();

if (method_exists($myChild, 'myFunction'))
{
    /* ... */
}

if (method_exists(Parent, 'myFunction'))
{
    /* ... */
}

if (is_callable(array('Parent', 'myFunction'))
{
    /* ... */
}

但以上都没有奏效。我不确定下一步该尝试什么。

感谢您的帮助!

6 个答案:

答案 0 :(得分:9)

您应该使用PHP的Reflection API:

class Parend
{
  public function myFunction()
  {

  }
}

class Child extends Parend{}

$c = new Child();


$rc = new ReflectionClass($c);
var_dump($rc->hasMethod('myFunction')); // true

如果你想知道该方法存在于哪个(父)类:

class Child2 extends Child{}

$c = new Child2();
$rc = new ReflectionClass($c);

while($rc->getParentClass())
{
    $parent = $rc->getParentClass()->name;
    $rc = new ReflectionClass($parent);
}
var_dump($parent); // 'Parend'

答案 1 :(得分:8)

Class child必须在这种情况下扩展父级

class Parent
{
   public function hello()
   {

   }
}

class Child extends Parent
{

}

$child = new Child();

if(method_exists($child,"hello"))
{
    $child->hello();
}

更新这与我认为的method_exists具有相同的效果。

function parent_method_exists($object,$method)
{
    foreach(class_parents($object) as $parent)
    {
        if(method_exists($parent,$method))
        {
           return true;
        }
    }
    return false;
}

if(method_exists($child,"hello") || parent_method_exists($object,"hello"))
{
    $child->hello();
}

刚从 Wrikken 的帖子

更新

答案 2 :(得分:4)

如果您想具体了解它是否存在 in 父级,而不是属于您自己的班级:

foreach(class_parents($this) as $parent){
    if(method_exists($parent,$method){
        //do something, for instance:
        parent::$method();
        break;
    }
}

答案 3 :(得分:1)

RobertPitt是正确的,因为Child类不是子类,除非它扩展Parent类。但是从原始代码段开始,以下内容应该是正确的:

if (method_exists('Parent', 'myFunction')
{
  // True
}

注意'Parent'在引号中,你没有引用它。将类名作为字符串传递。

答案 4 :(得分:1)

如果在子类中完成,method_exists和get_parent_class组合也不会起作用吗?

例如

class Parent
{

}

class Child extends Parent
{
   public function getConfig()
   {
     $hello = (method_exists(get_parent_class($this), 'getConfig')) ? parent::getConfig() : array();
   }
}

答案 5 :(得分:0)

例子:     if(method_exists(' Parent',' myFunction') 如果你想检查父构造函数,则在PHP 5.3.5中不起作用。

但这对我有用:

class Child extends Parent {
  function __construct($argument) {
    if(method_exists(get_parent_class(),"__construct")) parent::__construct($argument)
  }
}

仅当父构造函数存在于父类

中时才会调用它