2013-05-17 52 views
0
class Example { 
    # Instance member 
    private $member; 
    # Class member 
    private static $member; 
} 

這將導致以下錯誤:爲什麼PHP不允許類具有同名的類和實例成員?

Cannot redeclare Example::$member in ...

由於類和實例成員生活在不同的範圍,我發現該錯誤的有點意外,我不知道它背後的動機。

p.s.是否還有其他OO語言具有相同的風險?

+1

你有意外的Example另一個類?如果沒有,您是否還有更多的代碼可以發佈以供查看? –

+0

聲明瞭「$ class_member」的其他地方嗎? – Pitchinnate

+1

呵呵?我不明白,我沒有看到爲什麼該代碼會拋出錯誤。 –

回答

1

您也可以使用$this->name()來訪問靜態函數,看起來很醜陋。也許這是一個原因。

+0

這很奇特。但是,如果您使用變量(而不是方法)嘗試此操作,則會引發異常。 –

1

可以使用reflection

把它挖出來。如果你得到的屬性列表,就會有額外的標誌像isStatic。所以基本上屬性必須是唯一的,不管它們是不是靜態的。

1

原因很簡單:具有相同名稱的靜態和實例成員不明確。

例如,想象一下:

class Example { 
    # Instance member 
    private $member; 
    # Class member 
    private static $member; 

    public function AmbiguousCaller() { 
     //What should be returned? 
     return get_class_vars(get_class($this)); 
    } 
} 
+0

我想象它,然後我想象了另一件事 - 一個同時具有'get_class_vars'和'get_instance_vars'的PHP。我更喜歡後者。 –

+0

@EmanuilRusev這只是一個例子。反思是另一個很好的理由。 – Leri

相關問題