方法_存在于父类php中

方法_存在于父类php中,php,parent-child,Php,Parent Child,我试图使用php函数方法_exists,但我需要检查该方法是否存在于对象的父类中 因此: 但上述措施都不起作用。我不知道下一步该试什么 谢谢你的帮助 在这种情况下,类子级必须扩展父级 class Parent { public function hello() { } } class Child extends Parent { } $child = new Child(); if(method_exists($child,"hello")) { $child

我试图使用php函数方法_exists,但我需要检查该方法是否存在于对象的父类中

因此:

但上述措施都不起作用。我不知道下一步该试什么


谢谢你的帮助

在这种情况下,类子级必须扩展父级

class Parent
{
   public function hello()
   {

   }
}

class Child extends Parent
{

}

$child = new Child();

if(method_exists($child,"hello"))
{
    $child->hello();
}

我相信,更新此方法将产生与方法_相同的效果

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的帖子中更新的RobertPitt是正确的,因为子类不是子类,除非它扩展父类。但从原始代码片段来看,以下内容应该是正确的:

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

注意“父项”在引号中,您将其取消引号。将类名作为字符串传递。

如果您想明确知道它是否存在于父类中,而不仅仅存在于您自己的类中:

foreach(class_parents($this) as $parent){
    if(method_exists($parent,$method){
        //do something, for instance:
        parent::$method();
        break;
    }
}
您应该使用PHP的API:

如果您想知道该方法存在于哪个(父)类中:

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 Parent
{

}

class Child extends Parent
{
   public function getConfig()
   {
     $hello = (method_exists(get_parent_class($this), 'getConfig')) ? parent::getConfig() : array();
   }
}
例如: 如果(方法_存在('Parent','myFunction')) 如果您希望检查父构造函数,则在PHP5.3.5中不起作用

但这对我起了作用:

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

它只在父类中存在时调用父构造函数

我忘了添加扩展部分,在我的项目中,子类确实扩展了父类。它实际上是一个条令基础模型类,但在进一步的调查中,我认为我尝试做的不会起作用,因为条令基础模型类中的函数似乎与overl一起工作加载/拦截,因为没有函数声明visible@Serg如果实际代码中有
extends Parent
,那么第一个表达式
If(method_exists($myChild,'myFunction'))
将为真。(注意:我添加了右括号)@塞格:也许你应该在你的问题中添加一个更具体的例子,并详细解释你实际上想要实现的目标。谢谢大家,我最终使用了is_callable,现在它可以按照我的要求工作了。我相信
is_callable()
需要类实例作为第一个数组索引,而不是类名。例如
if(is_callable)(array)($myChild,'myFunction'))
-虽然要实现此功能,您的
子类需要扩展
父类(如下所述)。您需要知道a)父类是否实现了方法b)给定类的任何祖先实现了方法c)派生类的对象“has”一个特定的方法d)你可以对一个对象调用一个特定的方法吗?反射API是否也对使用重载/拦截的对象起作用?如果它动态地(在运行时)检查对象/类,那将是肯定的。不,它将无法捕获
\u call()
函数(尽管测试
\u call()
)的存在是很容易的。例如:
类A{function\u call($func,$args){}}$r=new ReflectionClass('A');var\u dump($r->hasMethod'thisRandomFunctionWorks')输出false,尽管可以调用该函数。做得好,这在PHP8.0.3下也可以工作!
class Parent
{

}

class Child extends Parent
{
   public function getConfig()
   {
     $hello = (method_exists(get_parent_class($this), 'getConfig')) ? parent::getConfig() : array();
   }
}
class Child extends Parent {
  function __construct($argument) {
    if(method_exists(get_parent_class(),"__construct")) parent::__construct($argument)
  }
}