2013-02-18 78 views
6

我有兩個代碼片段(關於static關鍵字),我希望他們有相同的輸出,但實際上輸出是不同的。PHP的靜態屬性

問題是爲什麼?

片段1

class base 
{ 
    public static $var = 1; 
} 

class sub extends base 
{ 
    public static $var = 2; 
} 

echo base::$var; // Outputs 1 

片段2

class base2 
{ 
    public static $var2 = 1; 
} 

class sub2 extends base2 
{ 
} 

sub2::$var2 = 2; 
echo base2::$var2; // Outputs 2 
+0

感謝小費,剛剛更新 – nut 2013-02-18 05:30:10

+0

我懷疑你是混淆了'const'的結果。在php中,'static'定義了一個獨立於實例的屬性。但它仍然可以改變。 – datasage 2013-02-18 05:31:15

+0

@ user1970939,你究竟想要完成什麼?輸出是不同的,因爲你刪除了'public static $ var = 2;'。但你知道。那麼真正的問題是什麼? – Matthew 2013-02-18 05:47:48

回答

11

我想多一個點添加到它。

STATIC變量是而不是與某個類的任何特定實例/對象相關聯。因此,您可以使用父類引用或子類引用修改該變量,同一副本會被修改。

從瞭解公共靜態作爲全球分開。因此,請把它理解爲沒有與任何特定的實例,因此任何類層次結構引用您更新一個靜態變量,相同的存儲空間得到更新。

-

維諾德

+0

中看到我對你的上一個問題的意見,以便按照你的解釋,如果我改變了第一個代碼的子類中var的值,像這個sub :: $ var = 3;它會更新類庫中var的值? – zamil 2013-02-18 05:58:17

+0

是的,的確如此。試試看。 – 2013-02-18 06:16:51

+0

不,它沒有:class base { public static $ var = 1; } class sub extends base { public static $ var = 2; } sub :: $ var = 3; echo base :: $ var; echo sub :: $ var;請試試這個 – zamil 2013-02-18 06:23:17

7

Public static variable表現爲global變量。

由於public static variable範圍在於全球範圍內,可以確保在任何global variable可以改變整個program.This概念可以看出,你可以在你的示例程序分析....

請在看Static variable inheritance

+0

感謝提示 – nut 2013-02-18 07:05:14

+0

不客氣....但是,我不會推薦使用靜態變量... – 2013-02-18 08:58:04

+1

@downvoter:照顧評論??? – 2013-11-13 03:54:00

0

由於sub2類不具有var2,因此需要base2類的值。因此,當您使用此sub2::$var2 = 2;分配新值時,它將更改爲新值。

在第一個代碼已覆蓋在你的擴展class.Both變量都有各自的類中的範圍。

+0

這是錯誤的,對於靜態變量/方法沒有超載的概念。它只是共享內存。請參閱我的評論 – 2013-02-18 05:44:28

+0

我們絕對可以重寫靜態方法。但不確定靜態屬性,但是如果你在擴展類中聲明瞭與父類相同的變量,它們不會指向相同的內存位置。 – zamil 2013-02-18 06:58:34

+0

同意,請在我的回答 – 2013-02-18 07:01:59

0

如果傳遞一個靜態變量來一個子類,那麼這個變量是共享的(它總是在兩個班的值相同)。如果你覆蓋了一個子類中的靜態變量,那麼它的一個新的靜態變量獨立於來自父類的靜態變量。

片段1base::varsub::var有不同的內存分配,因爲你在類sub定義$var = 2;

片段2base::varsub::var具有相同的內存分配,因爲你沒有在課堂上sub2指定$var2

那就是爲什麼base:var沒有變化。這也不會,如果你從sub級以後像這樣的改變$var改變:

class base 
{ 
    public static $var = 1; 
} 

class sub extends base 
{ 
    public static $var = 2; 
} 
sub::var = 3 
echo base::var; // Outputs 1