method_exists в родительском классе php - PullRequest
7 голосов
/ 22 июля 2010

Я пытаюсь использовать функцию php method_exists, но мне нужно проверить, существует ли этот метод в родительском классе объекта.из вышеперечисленного работают.Я не уверен, что попробовать дальше.

Спасибо за любую помощь!

Ответы [ 6 ]

9 голосов
/ 22 июля 2010

Вы должны использовать 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'
8 голосов
/ 22 июля 2010

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

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

5 голосов
/ 22 июля 2010

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

foreach(class_parents($this) as $parent){
    if(method_exists($parent,$method){
        //do something, for instance:
        parent::$method();
        break;
    }
}
1 голос
/ 22 сентября 2010

Не будут ли работать 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();
   }
}
1 голос
/ 22 июля 2010

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

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

Обратите внимание, что 'Parent' в кавычках, у вас его нет в кавычках.Передача имени класса в виде строки.

0 голосов
/ 13 ноября 2014

Пример: 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)
  }
}

Вызывает родительский конструктор, только если он существует в родительском классе

...