2013-02-11 74 views
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'的風暴評論。我很清楚這種語言的特點。我只想知道,除了「它只是以這種方式增長」以外,是否有這個原因。

+1

有兩個核心限制:1)PHP使用單通編譯而不是AST,2)PHP對函數和變量使用不同的符號。 ($ this-> foo()是一個函數調用還是一個名爲封閉函數foo的實例變量?)這些限制通常在OO模型中感受到,因爲它在PHP的生命中稍後出現。 – Matthew 2013-02-11 14:50:06

+0

任何人都知道如果$ otherClass是靜態的,該怎麼辦? – Dan 2014-08-25 03:42:12

回答

3

這是一個限制,確實和有它的一個原因: 的::範圍運營商擁有超過->一個更高的優先級,這意味着:

$this->otherclass::ALIAS; 

將被解讀爲:

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

因此引發錯誤。

這實際上是PHP繼承了C++的probably的一項功能。

+0

謝謝!這很有道理。 – dnagirl 2013-02-11 14:50:32

+0

不是。其他「變量變量」功能需要消除歧義,但已將其作爲語言。允許'{$ this-> otherclass} :: ALIAS'就足夠了。 – 2013-02-11 14:51:23

+2

@LightnessRacesinOrbit:他的解釋*解釋了爲什麼它不起作用。爲什麼不允許'{$ this-> otherclass} :: ALIAS'是另一個問題。 – dnagirl 2013-02-11 14:53:58

1

是的,你不能這樣做,沒有明確的理由。沒有語法,搞亂了語法,提供了這種極端的邊緣情況,你已經證明這是一個微不足道的解決方法。

我幾乎不敢說它是一個「限制」,它當然不是「怪癖」。 PHP也不能烘烤麪包。

真的,如果您看到代碼$this->classname::somefunction(),它是否立即對您有直觀意義?羅。這是,你不能這樣做。

相關問題