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

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

Но никто из вышеперечисленных не работает. Я не уверен, что попробовать дальше.

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

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

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

     class Parent { public function hello() { } } class Child extends Parent { } $child = new Child(); if(method_exists($child,"hello")) { $child->hello(); } 

    Update Это будет иметь тот же эффект, что и 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

    Вы должны использовать 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' в 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' 

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

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

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

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

    Обратите внимание, что «Родитель» находится в кавычках, у вас его некорректно. Передача имени класса в виде строки.

    Не будет ли метод 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(); } } 

    Пример: if (method_exists («Родительский», «myFunction») не работает в PHP 5.3.5, если вы хотите проверить родительский конструктор.

    Но это сработало для меня:

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

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