1

在 PHP 中,只要类名是有效的对象或字符串,就可以访问静态成员或函数。这大多是真的。当类名字符串是对象的属性时,不能直接使用。它必须先复制到一个简单的变量中,然后才能用于访问静态成员。这是一个例子:

class Foo {
  protected $otherclass='Bar'; //string!

  function out(){
    $class=$this->otherclass;
    echo $class::ALIAS;  //Where everyone knows your name.
  }

  function noout_err(){
    echo $this->otherclass::ALIAS; //syntax error, unexpected '::' 
  }
}

class Bar {
  const ALIAS='Where everyone knows your name.'
}

这个怪癖困扰了我一段时间。所以我一直在想:

  • 这是 OOP 语言之间的常见限制吗?
  • 熟悉 PHP 内部原理的人可以解释为什么$this->classname::somefunction()不合意的语法吗?

这并不是要引起“因为 php sux”评论的风暴。我很清楚这种语言的特点。我只是想知道除了“它只是那样成长”之外,是否还有其他原因。

4

2 回答 2

3

这确实是一个限制,这是有原因的:::范围运算符具有更高的优先级,->这意味着:

$this->otherclass::ALIAS;

将被读作:

($this->(otherclass::ALIAS));

因此触发错误。

这实际上是 PHP可能由 C++ 继承的一个特性。

于 2013-02-11T14:46:54.183 回答
1

是的,你不能这样做,也没有明确的理由。根本没有语法,弄乱了语法,来提供这种极端的边缘情况,您已经证明了有一个简单的解决方法。

我几乎不会称其为“限制”,这当然不是“怪癖”。PHP 也不能烤面包。

真的,如果您看到代码$this->classname::somefunction(),您是否会立即感到直观?不。你不能这样做很好

于 2013-02-11T14:44:26.913 回答