2014-12-02 55 views
0

如果一個常量類定義是這樣的:如何訪問常量沒有靜態的方式

class Example 
{ 

    const MIN_VALUE = 0.0;  // RIGHT - Works INSIDE of a class definition. 

} 

就可以訪問這樣的常數:

Example::MIN_VALUE 

,但如果你這樣做:

class Sample { 

    protected $example; 
    public function __construct(Example $example){ 
     $this->example = $example; 
    } 

    public function dummyAccessToExampleConstant(){ 

     //doesn't work -> syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM) 
     if($this->example::MIN_VALUE === 0.0){ 

     } 

     //this works 
     $tmpExample = $this->example; 
     if($tmpExample::MIN_VALUE === 1){ 

     } 
    } 
} 

有人可以解釋我這種行爲的原因嗎?

有一個很好的理由或者是它只是一個語言結構,以防止與訪問「::」

有沒有辦法如何訪問一個常量「$這個」

回答

2

這是PHP解析器的一個不幸的缺點。這將工作:

$example = $this->example; 
$min = $example::MIN_VALUE; 

這不會:

$min = $this->example::MIN_VALUE; 

編輯:

這個問題在PHP的bug#63789記載:https://bugs.php.net/bug.php?id=63789

它已經固定,但你將不得不等到PHP的下一個主要版本(7)。

+0

你已經重複我的示例代碼與其他變量名稱;-) – MadeOfSport 2014-12-02 22:06:54

+0

這是故意的。 PHP不會讓我們在屬性訪問器' - >'之後引用'::'運算符。您必須首先將該屬性分配給一個變量,然後訪問該變量上的const。 – 2014-12-02 22:08:47

+0

好的謝謝。你知道一些官方的php內部爲什麼沒有實現嗎? – MadeOfSport 2014-12-02 22:11:47

1

這是一個類常量。沒有必要(也沒有辦法)以實例爲基礎訪問它。

您只需以Example::MIN_VALUE的身份訪問它即可消除任何混淆。

PHP> 5.3允許通過實例訪問(即$class_instance::CLASS_CONSTANT),但這仍然不會與該實例的屬性相混淆,該屬性可以通過->(如果公開的話)訪問。

+0

然而,PHP允許它:http://php.net/manual/en/language.oop5.constants.php – 2014-12-02 22:05:07

0
Is there a way how to access a constant with "$this" 

你並不需要訪問一個常量$this,因爲$thiscurrent instanciated object of a class。可以在不實例化對象的情況下訪問常量。

Is there a good reason or is it just a language construct ... 

的常數,因爲它的名字所暗示的,它是一個constant value,這意味着變量的值在執行過程中不會發生變化,這就是爲什麼你不需要實例化一個對象來訪問它的值。

希望它很清楚!

+0

不,我不明白;-)我用依賴注入的對象工作了很多,有時我需要從那裏訪問常量,所以如果我必須通過靜態方法訪問常量,它會打破我的設計。從語言設計缺乏的角度來看,我試圖理解爲什麼php設計師已經像他們那樣做出了決定。感謝您的回答。 – MadeOfSport 2014-12-02 22:18:19