$ var :: staticfunction()OK但$ this-> var :: staticfunction()NOT。理由是什么?

时间:2013-02-11 14:36:21

标签: php static

在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.'
}

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

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

这并不意味着引发'因为php sux'评论的风暴。我很清楚这种语言的特点。我只是想知道除了'它只是那种方式'之外,是否有其他原因。

2 个答案:

答案 0 :(得分:3)

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

$this->otherclass::ALIAS;

将被理解为:

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

因此触发错误。

这实际上是PHP通过C ++继承probably的功能。

答案 1 :(得分:1)

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

我几乎没有把它称为“限制”,而且肯定不是“怪癖”。 PHP也不能烤面包。

真的,如果您看到代码$this->classname::somefunction(),它会立即对您有直觉意义吗?罗。 good 你不能这样做。