您好,登錄后才能下訂單哦!
封裝,繼承,多態(tài)是面向?qū)ο笕蠡咎匦?。這里翻譯一個(gè)在 stackoverflow 上看到的說(shuō)明 php 靜態(tài)變量與方法不具備多態(tài)性的例子。
PHP 中用 static 關(guān)鍵字來(lái)定義靜態(tài)方法與變量。
首先來(lái)看靜態(tài)方法
class Person{ public static function status(){ self::getStatus(); } protected static function getStatus(){ echo "Person is alive"; } } class Deseased extends Person{ protected static function getStatus(){ echo "Person is deseased"; } } Person::status(); echo "<br>"; Deseased::status();
此處兩個(gè)輸出的結(jié)果都是 "Person is alive" ,這是因?yàn)?self 的作用域在定義類時(shí)被確定,而不是在執(zhí)行類時(shí)。因此即使 我們?cè)?Deseased 中調(diào)用 status, getStatus 在 Deseased 中被重載,self 始終指向 Person 中的 getStatus 函數(shù)。
對(duì)于靜態(tài)變量,同理
class Person{ static $status = 'alive'; public function getStatus(){ echo "Person is ".self::$status; } } class Deseased extends Person{ static $status = 'deseased'; /*public function getStatus(){ echo "Person is ".self::$status; }*/ } Person::getStatus(); echo "<br>"; Deseased::getStatus();
輸出結(jié)果依舊是兩個(gè) "Person is alive", 要想得到 "Person is deseased" 結(jié)果,只需把注釋部分去掉即可
綜上所述,php 通過(guò)在定義類時(shí)就確定 self 的作用域,使得靜態(tài)變量和方法不具備多態(tài)性。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。