在PHP中,只要类名是有效对象或字符串,就可以访问静态成员或函数。这主要是 true。当类名字符串是对象的属性时,不能直接使用它。必须先将其复制到一个简单变量,然后才能使用它来访问静态成员。这是一个例子:
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.'
}
这个怪癖现在困扰了我一段时间。所以我一直在想:
$this->classname::somefunction()
不是理想的语法?这并不意味着引发'因为php sux'评论的风暴。我很清楚这种语言的特点。我只是想知道除了'它只是那种方式'之外,是否有其他原因。
答案 0 :(得分:3)
这确实是一种限制,这是有原因的:
::
范围运算符的优先级高于->
,这意味着:
$this->otherclass::ALIAS;
将被理解为:
($this->(otherclass::ALIAS));
因此触发错误。
这实际上是PHP通过C ++继承probably的功能。
答案 1 :(得分:1)
是的,你不能这样做,而且没有明确的理由。根本没有语法,搞乱了语法,为这个极端边缘情况提供了一个你已经证明有一个简单的解决方法。
我几乎没有把它称为“限制”,而且肯定不是“怪癖”。 PHP也不能烤面包。
真的,如果您看到代码$this->classname::somefunction()
,它会立即对您有直觉意义吗?罗。 good 你不能这样做。