PHP中为什么不能使用多个双冒号?

7
在PHP 5.3.6中,我注意到以下内容无法正常工作:
class Foo{
    public static $class = 'Bar';
}

class Bar{
    public static function sayHello(){
        echo 'Hello World';
    }
}

Foo::$class::sayHello();

发生了一个“unexpected T_PAAMAYIM_NEKUDOTAYIM”的错误。然而,使用临时变量可以得到预期的结果:
$class = Foo::$class;
$class::sayHello(); // Hello World

有人知道这是设计意图还是作用域解析运算符分词错误导致的结果吗?除了使用后者的临时变量示例,是否有更清晰的解决方法?


或许可以尝试使用花括号语法向量。类似这样:{${Foo::$class}}::sayHello(); 这样做可能有效。不过我手头没有 PHP 解析器。 - Mark Tomlin
谢谢@Mark Tomlin - 不幸的是,不行,我可能尝试了所有可能的组合。它总是在寻找$Foo$Bar - Dan Lugg
如果我记得这个问题,下班回家后我会试一下。这段代码在5.3.6之前工作吗? - Mark Tomlin
@Mark Tomlin - 据我所知,这从来没有起作用过。当然,随着 PHP 5.x 中静态调用的动态类名的引入,支持这一功能是有意义的,但也有可能会出现疏忽。 - Dan Lugg
这就像是 PHP 开发人员没有考虑到的一种非常奇怪的 延迟静态绑定 版本。 - Mark Tomlin
1个回答

2

很遗憾,没有一行命令可以完成此操作。我曾以为可以使用 call_user_func() 来实现,但不行:

call_user_func(Foo::$class.'::sayHello()');
// Warning: call_user_func() expects parameter 1 to be a valid callback, class 'Bar' does not have a method 'sayHello()'

此外,你为什么要首先这样做呢?我相信如果你使用变量变量或类名,通常都有更好的方法来实现你想要做的事情。


谢谢@Mike - 我明白它的使用有限,但是 "静态链接" 在我正在开发的一些动态加载器中有用途。当然有替代方案,但这种语法对于辅助加载来说是一个甜蜜的好处。 - Dan Lugg
1
还有 @Mike - 你的尝试是可以的,只需要做一个小改变; call_user_func(array(Foo::$class, 'sayHello')); - Dan Lugg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接