方法_存在于父类php中
我试图使用php函数方法_exists,但我需要检查该方法是否存在于对象的父类中 因此: 但上述措施都不起作用。我不知道下一步该试什么方法_存在于父类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
谢谢你的帮助 在这种情况下,类子级必须扩展父级
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)
}
}