溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP 靜態(tài)變量與方法不具備多態(tài)性

發(fā)布時(shí)間:2020-07-21 05:37:07 來(lái)源:網(wǎng)絡(luò) 閱讀:536 作者:GIpanda 欄目:web開(kāi)發(fā)

封裝,繼承,多態(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)性。




向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI