2014-05-10 128 views
-1

我有一個簡單的示例代碼,其中我想將對象操作符與範圍解析一起使用以獲取類常量(PHP 5.5)。PHP - 在另一個對象中訪問這個對象的const

<?php 


class A { 
    const MY_CONST = 'This is my const'; 
} 

class B { 

    private $property; 

    public function __construct(A $a) {  
     $this->property = $a; 

     echo $a::MY_CONST."<br />"; // works (1) 

     echo A::MY_CONST."<br />"; // works (2) 

     $obj = $this->property; 

     echo $obj::MY_CONST."<br />"; // works (3) 

     echo $this->property::MY_CONST; // doesn't work (4)    
    } 

} 

$b = new B(new A); 

該代碼已在PHP 5.5.12中測試過,我不關心在這個問題中與早期PHP版本的兼容性。

問題是 - 如果將對象設置爲其他類的屬性(如(4)中所示,並且您希望將$ this與const名稱一起使用,是否可以訪問對象const? 1和2顯然有效,3中的簡單分配也起作用,但會增加一行。

如果這是不可能的,是否有任何理由否定它或簡單的PHP開發人員決定如此或簡單忘了使其工作?對我來說,這是相當奇怪的是,4不工作,但3工作沒有任何問題

+0

你應該首先意識到你的錯誤:常量定義爲_class_實體,而不是_instance_實體。即使PHP允許實例取消引用,如果您想引用實例「常量」,那麼在邏輯中也是一個錯誤。所以如果PHP在這裏有錯誤(顯然,它有) - 那麼它就是這樣的事情,它允許類通過實例進行常量去引用,而不是在事物中,通過另一個類屬性擁有者不可能引用這樣的去引用 –

+1

也許,但在這個例子中,我並沒有考慮邏輯,而是關於爲什麼第三種情況起作用,而第四種情況不起作用。無論是應該工作,或在我看來他們都沒有 –

回答

1

回答你的問題是:是的,這是可能的。但在threee迂迴的方式之一:

$tmp = $this->property; 
return $tmp::MY_CONST; 

或者,國際海事組織,一個更直觀:

$class = get_class($this->property); 
return $class::MY_CONST; 

這樣做的另一種方法是:

$r = new RefletionClass($this->property); 
return $r->getConstant('MY_CONSTANT'); 

至於你的代碼生成解析器錯誤的原因,我不是100%確定的。但是,我可以告訴你,PHP語法非常複雜,而且有點麻煩。
雖然我不會感到驚訝,但要知道$this->foo::BAR是一個解析解析器的表達式,它解釋瞭解析錯誤。

+0

這種解決方案比第三種情況更復雜,所以我恐怕這不是最好的解決方案(但也許是唯一的解決方案)。 –

+0

@MarcinNabiałek:對不起,沒有注意到你已經在你發佈的代碼中工作(應該看起來更接近) –