PHP靜態(tài)屬性中的子類改變父類该面、子類改變子類的問題。

一信卡、靜態(tài)實例

這里我定義了一個如下的類

class A{
    protected static $instance;

    public static function setInstance($ins){
        static::$instance = $ins;
    }

    public static function getInstance(){
        return static::$instance;
    }
}
class B extends A
{

}

// 設(shè)置值
B::setInstance('hello');

var_dump(B::getInstance()); echo '<br>';
var_dump(A::getInstance()); echo '<br>';

這里static::的作用類似于self::隔缀,但是是有區(qū)別的 。具體差別請自行查詢了解坐求。

你覺的會輸出什么蚕泽?也許你會覺得,第一個輸出'hello'桥嗤,第二個應(yīng)該輸出'null'须妻。
但是,實際輸出

string(5) "hello"
string(5) "hello"

我們又加一個C類泛领,繼承與A類荒吏,然后通過C去修改靜態(tài)變量$instance的值。

...
class C extends A
{

}
C::setInstance('world');
var_dump(C::getInstance()); echo '<br>';
var_dump(B::getInstance()); echo '<br>';
var_dump(A::getInstance()); echo '<br>';

此時再打印渊鞋,你怎么看绰更?可能又要猜錯了瞧挤。
此時輸出的是

string(5) "world"
string(5) "world"
string(5) "world"

此時你是不是已發(fā)現(xiàn),子類改變了父類的值儡湾,并改變了和它一起繼承的另外的一個子類的值特恬。不知道有沒有顛覆你的想象。先提一句徐钠,這只是靜態(tài)屬性的問題癌刽。具體請往下看。

二尝丐、普通實例

這次展示下普通實例下的效果

class A{
    protected $instance;

    public function setInstance($ins){
        $this->instance = $ins;
    }

    public function getInstance(){
        return $this->instance;
    }
}
class B extends A
{

}


class C extends A
{

}
// 設(shè)置值
$b = new B;
$b->setInstance('hello');
var_dump($b->getInstance()); echo '<br>';
var_dump((new A)->getInstance()); echo '<br>';

echo '<hr>';

$c = new C;
$c->setInstance('world');
var_dump($c->getInstance()); echo '<br>';
var_dump((new B)->getInstance()); echo '<br>';
var_dump((new A)->getInstance()); echo '<br>';

結(jié)果如下

string(5) "hello"
NULL

string(5) "world"
NULL
NULL

這種情況显拜,就比較符合大家的預(yù)期。

三爹袁、原因分析

所以远荠,靜態(tài)屬性的繼承跟我們默認(rèn)想象的不一樣哦,盡管我們在子類里可以獲取它失息,可以修改它譬淳,但是這個它,指向的都是父類里的那個靜態(tài)屬性根时。
確實是子類能改變父類瘦赫,子類能改變子類。也或者說蛤迎,所有的父類和子類,都是共享這一個靜態(tài)屬性含友。
當(dāng)然替裆,上面的情況僅發(fā)生在你的子類里,沒有額外定義一個同名靜態(tài)屬性的情況下窘问。
如果這樣:

class A{
    protected static $instance;

    public static function setInstance($ins){
        static::$instance = $ins;
    }

    public static function getInstance(){
        return static::$instance;
    }
}
class B extends A
{
    protected static $instance;
}


class C extends A
{
    protected static $instance;
}
// 設(shè)置值
B::setInstance('hello');

var_dump(B::getInstance()); echo '<br>';
var_dump(A::getInstance()); echo '<br>';

echo '<hr>';
C::setInstance('world');
var_dump(C::getInstance()); echo '<br>';
var_dump(B::getInstance()); echo '<br>';
var_dump(A::getInstance()); echo '<br>';

此時打印的結(jié)果

string(5) "hello"
NULL

string(5) "world"
string(5) "hello"
NULL

我們在各個子類內(nèi)部辆童,定義了一個$instance屬性,這時候就是各自是各自的了惠赫,不再共享了把鉴。

用處
很多知名的框架,比如laravel里面大量使用了靜態(tài)屬性儿咱,當(dāng)然也包括靜態(tài)調(diào)用綁定庭砍,在查看源碼的時候就要注意這一點。父類和子類是不是共享的一個靜態(tài)屬性混埠,子類里面有沒有重新定義怠缸。子類更改靜態(tài)屬性是否會影響父類嗎。最簡單直接的就是laravel框架的$app钳宪,它是如何保證整個程序那么多個類揭北,在運(yùn)行的時候都是用的同一個larave例本身的扳炬,都是指向同一個$app的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搔体,一起剝皮案震驚了整個濱河市恨樟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疚俱,老刑警劉巖厌杜,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異计螺,居然都是意外死亡夯尽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門登馒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匙握,“玉大人,你說我怎么就攤上這事陈轿∪Ψ模” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵麦射,是天一觀的道長蛾娶。 經(jīng)常有香客問我,道長潜秋,這世上最難降的妖魔是什么蛔琅? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮峻呛,結(jié)果婚禮上罗售,老公的妹妹穿的比我還像新娘。我一直安慰自己钩述,他們只是感情好寨躁,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牙勘,像睡著了一般职恳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上方面,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天放钦,我揣著相機(jī)與錄音,去河邊找鬼葡幸。 笑死最筒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔚叨。 我是一名探鬼主播床蜘,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼辙培,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邢锯?” 一聲冷哼從身側(cè)響起扬蕊,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丹擎,沒想到半個月后尾抑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蒂培,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年再愈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片护戳。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡翎冲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媳荒,到底是詐尸還是另有隱情抗悍,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布钳枕,位于F島的核電站缴渊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鱼炒。R本人自食惡果不足惜衔沼,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望田柔。 院中可真熱鬧俐巴,春花似錦、人聲如沸硬爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缀磕。三九已至,卻和暖如春劣光,著一層夾襖步出監(jiān)牢的瞬間袜蚕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工绢涡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留牲剃,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓雄可,卻偏偏與公主長得像凿傅,于是被迫代替她去往敵國和親缠犀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348