Я пытаюсь использовать функцию 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')) { /* ... */ }
Но никто из вышеперечисленных не работает. Я не уверен, что попробовать дальше.
Спасибо за любую помощь!
В этом случае дочерний элемент класса должен продлить родителя
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) } }
Он вызывает родительский конструктор только в том случае, если он существует в родительском классе