我正在尝试使用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'))
{
/* ... */
}
但以上都没有奏效。我不确定下一步该尝试什么。
感谢您的帮助!
答案 0 :(得分:9)
您应该使用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'
答案 1 :(得分:8)
Class child必须在这种情况下扩展父级
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 的帖子
更新答案 2 :(得分:4)
如果您想具体了解它是否存在 in 父级,而不是仅属于您自己的班级:
foreach(class_parents($this) as $parent){
if(method_exists($parent,$method){
//do something, for instance:
parent::$method();
break;
}
}
答案 3 :(得分:1)
RobertPitt是正确的,因为Child
类不是子类,除非它扩展Parent
类。但是从原始代码段开始,以下内容应该是正确的:
if (method_exists('Parent', 'myFunction')
{
// True
}
注意'Parent'在引号中,你没有引用它。将类名作为字符串传递。
答案 4 :(得分:1)
如果在子类中完成,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();
}
}
答案 5 :(得分:0)
例子: 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)
}
}
仅当父构造函数存在于父类
中时才会调用它