【问题标题】:Multiple paamayim nekudotayims in PHP, why not?PHP中的多个paamayim nekudotaims,为什么不呢?
【发布时间】:2011-09-30 23:01:19
【问题描述】:

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 - 不幸的是,我可能已经尝试了所有可能的组合。它总是最终寻找$Foo$Bar
  • 如果我记得这个问题,我会在我下班回家时试一试。代码在 5.3.6 之前有效吗?
  • @Mark Tomlin - 不,据我所知,它没有起作用。随着在 PHP 5.x 中为静态调用引入动态类名,这将是有道理的,这也将得到支持,当然除非有疏忽的可能性。
  • 这就像一个非常奇怪的late static bindings 版本,PHP 开发人员没有考虑过。

标签: php static-methods dynamic-class scope-resolution


【解决方案1】:

不幸的是,没有办法在一行中做到这一点。我以为你可以用 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 - 我知道它的用途有限,但是“静态链接”在我正在研究的一些动态加载器中使用。当然还有其他选择,但是这种语法对于加载帮助程序来说是一个甜蜜的好处。
  • 还有@Mike - 您的尝试确实可以进行微小的更改; call_user_func(array(Foo::$class, 'sayHello'));
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2015-09-13
相关资源
最近更新 更多