下面是代码片段:
class A
{
static function bar()
{
echo get_called_class(), "\n";
}
}
class B extends A
{
static function foo()
{
call_user_func(['parent', 'bar']);// B why?
call_user_func([parent::class, 'bar']); // A
call_user_func(parent::class . '::bar');// A
}
}
- 为什么
call_user_func(['parent', 'bar'])
返回B
? ['parent', 'bar']
和[parent::class, 'bar']
之间的区别是什么?
1条答案
按热度按时间0x6upsns1#
在最新的PHP版本中,您可能会看到以下弃用消息:
已弃用:已弃用可调用对象中的“parent”
您可以在此处找到更多有关弃用的详细信息:
我觉得这个问题不容易回答,但我是这样理解的:由于“parent”只是一个字符串和一个泛型名称,因此其含义(具体的类)取决于上下文。
我怀疑
get_called_class()
因此与它不兼容,并且不能像您所期望的那样解析类上下文。使用
parent::class
时,PHP可以正确地将上下文解析为具体的类名,因此将其与call_user_func()
一起使用时不会出现这种歧义或上下文问题。