2013-05-10 42 views
2

這是一些可能被過度編碼的代碼的簡單示例,但我想使用類常量訪問類成員變量,並且想知道是否有比使用$ foo- > __低於?使用常量的PHP訪問成員變量

class Foo 
{ 
    const BAR = 'bar'; 

    private $props = array(self::BAR => 'wee'); 

    public function __get($name) 
    { 
     return $this->props[$name]; 
    } 
} 

$foo = new Foo(); 
echo $foo->__get(Foo::BAR); 
+0

'echo Foo :: BAR' – 2013-05-10 23:38:57

+0

@MikeBrant那會返回「bar」,而不是「wee」,對吧? – Wiseguy 2013-05-10 23:54:31

+0

對不起,我意識到我沒有閱讀正確的問題。它絕對會返回'酒吧',但這正是我最初想要尋找的問題。 – 2013-05-11 00:02:17

回答

4

這也適用於:

$foo->{Foo::BAR}; 

或實施ArrayAccess,那麼你可以有:

$foo[Foo::BAR] 

但爲何不以$foo->bar的身份訪問?你打算改變這個常數還是我在這裏錯過了一些東西?

+0

Foo是一個自動生成的類,雖然變化不大,但偶爾會出現。這正是我正在尋找的,謝謝! – fwrawx 2013-05-12 00:56:08

1

我認爲的代碼看起來不錯,但你可以使用構造函數初始化props陣列:

class Foo 
{ 
    const BAR = 'bar'; 

    private $props; 

    public function __construct() { 
     $this->props = array(self::BAR => 'wee'); 
    } 

    public function __get($name) 
    { 
     return $this->props[$name]; 
    } 
} 
+0

[爲什麼不](http://codepad.viper-7.com/iccdMD)?常量可以在編譯時進行評估。 – Wiseguy 2013-05-10 23:32:42

+0

但它們不能用於類(屬性)聲明構造。爲什麼不? - >這個問題需要PHP解析器處理依賴關係。但PHP解析器不 – hek2mgl 2013-05-10 23:33:35

+0

嘿,你是對的! :)感謝您花時間準備這個例子(請注意,如果有人*顯示*我錯了,我真的很感激:)) – hek2mgl 2013-05-10 23:48:20