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