无法理解使用call_user_func的PHP代码片段

bkhjykvo  于 2023-02-11  发布在  PHP
关注(0)|答案(1)|浏览(102)

下面是代码片段:

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']之间的区别是什么?
0x6upsns

0x6upsns1#

在最新的PHP版本中,您可能会看到以下弃用消息:
已弃用:已弃用可调用对象中的“parent”
您可以在此处找到更多有关弃用的详细信息:

我觉得这个问题不容易回答,但我是这样理解的:由于“parent”只是一个字符串和一个泛型名称,因此其含义(具体的类)取决于上下文。
我怀疑get_called_class()因此与它不兼容,并且不能像您所期望的那样解析类上下文。
使用parent::class时,PHP可以正确地将上下文解析为具体的类名,因此将其与call_user_func()一起使用时不会出现这种歧义或上下文问题。

相关问题