2009-07-30 106 views
4

如果我宣佈一個基類如下:有沒有辦法讓PHP的子類繼承屬性(靜態和實例)?

abstract class Parent { 

    protected static $message = "UNTOUCHED"; 

    public static function yeah() { 
     static::$message = "YEAH"; 
    } 
    public static function nope() { 
     static::$message = "NOPE"; 
    } 

    public static function lateStaticDebug() { 
     return(static::$message); 
    } 

} 

,然後擴展它:

class Child extends Parent { 
} 

,然後做到這一點:

Parent::yeah(); 
Parent::lateStaticDebug(); // "YEAH" 

Child::nope(); 
Child::lateStaticDebug(); // "NOPE" 

Parent::yeah(); 
Child::lateStaticDebug() // "YEAH" 

有沒有辦法讓我的第二從第一個繼承的類也繼承屬性,而不僅僅是方法?

我只是想知道是否有關於PHP的晚期靜態綁定和繼承,這將允許這一點。我已經開始解決這個問題了......但是,如果一個未聲明的靜態屬性會爲其價值回落到它的父項上,似乎沒有意義!

+0

我已經創建了下面的PHP錯誤報告: http://bugs.php.net/49105 我鼓勵人們去檢查出來,並給予支持。這是一個相當嚴格的限制。目前的行爲也完全沒有意義。 – 2009-07-30 00:43:21

+0

似乎人們已經將自己辭退到了不直觀的默認行爲上。這裏的問題是PHP不正確的默認行爲,或者需要一種動態聲明屬性的方法。 – 2009-07-30 13:13:43

+0

我完全支持你的追求,這種行爲非常煩人!不幸的是,它似乎在這裏停留。 – djfm 2012-06-30 15:10:13

回答

-2

答案是「有解決方法」。

您必須創建一個靜態構造函數並讓它調用以複製該屬性。

1

繼承和static屬性有時會導致PHP中的「奇怪」的事情。

您應該看看PHP手冊中的Late Static Bindings:它解釋了在PHP中繼承和使用static屬性時可能發生的情況< = 5.2;併爲PHP> = 5.3提供瞭解決方案,您可以使用static::關鍵字而不是self::,以便在執行(而不是編譯)時執行靜態綁定。

相關問題