method_exists в родительском классе php

Я пытаюсь использовать функцию 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'))
{
    /* ... */
}

Но ни одно из вышеупомянутого не работает. Я не уверен, что попробовать затем.

Спасибо за любую справку!

7
задан Serg 22 July 2010 в 21:07
поделиться

4 ответа

В этом случае дочерний класс должен расширять родительский

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

9
ответ дан 6 December 2019 в 07:05
поделиться

Вы должны использовать Reflection API PHP:

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'
9
ответ дан 6 December 2019 в 07:05
поделиться

Если вы хотите узнать, существует ли он в родительском классе, а не только в вашем собственном классе:

foreach(class_parents($this) as $parent){
    if(method_exists($parent,$method){
        //do something, for instance:
        parent::$method();
        break;
    }
}
5
ответ дан 6 December 2019 в 07:05
поделиться

Роберт Питт прав в том, что класс Child не является дочерним классом, если он не расширяет класс Parent . Но из вашего исходного фрагмента кода должно быть верно следующее:

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

Обратите внимание, что «родительский элемент» заключен в кавычки, у вас он не был заключен в кавычки. Передача имени класса в виде строки.

1
ответ дан 6 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: