2013-03-02 143 views
2

告訴我,如果我錯了,但我很確定這是PHP中的錯誤。子類覆蓋父靜態屬性

<?php 

class One { 

    public static $var = 'hi'; 
} 

class Two extends One { 

    public static function set($var) { 
     static::$var = $var; 
    } 
} 

Two::set('bye'); 

var_dump(One::$var); 
// bye 

當我很確定它應該輸出'hi'時,該腳本輸出'bye'。你怎麼看?

想在子類中重新聲明這一點。

回答

0

OP編輯的問題,這是之前,他提到,他不希望再聲明性質

它的答案,因爲Two$varOne

如果你會寫這樣的,那麼你會得到所需要的輸出

class One { 

    public static $var = 'hi'; 
} 

class Two extends One { 

    public static $var = 'hi'; 

    public static function set($var) { 
     static::$var = $var; 
    } 
} 

Two::set('bye'); 

// you get hi 
var_dump(One::$var); 
// you get bye 
var_dump(Two::$var); 
+0

我不想在子類中重新聲明它。 – Nathaniel 2013-03-02 13:50:14

+0

不可能我很害怕。 – 2013-03-02 13:59:46

0

我認爲這是不可能的,但如果你不想重新聲明簡單的構造函數定義它..

class One { 

    public static $var = 'hi'; 
} 

class Two extends One { 

    public static $var; 

    public function __construct(){ 
     self::$var = parent::$var; 
    } 

    public static function set($var) { 
     self::$var = $var; 
    } 
} 

Two::set('bye'); 

var_dump(One::$var); 
var_dump(Two::$var); 
+0

如何不重新聲明'$ var',你在兩個類中聲明瞭它? – 2013-03-02 14:34:55

+0

是的我正在重新宣佈,但它不會讓你每次出現(當你必須)時都改變你的var,並且因爲我不明白他爲什麼不想重新聲明。 – Guilherme 2013-03-02 14:42:31

+0

我不想重新聲明,因爲它是一個框架,我不能確定誰使用它會重新聲明這個變量。 – Nathaniel 2013-03-02 15:35:24