您好,登錄后才能下訂單哦!
封裝,繼承,多態是面向對象三大基本特性。這里翻譯一個在 stackoverflow 上看到的說明 php 靜態變量與方法不具備多態性的例子。
PHP 中用 static 關鍵字來定義靜態方法與變量。
首先來看靜態方法
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();
此處兩個輸出的結果都是 "Person is alive" ,這是因為 self 的作用域在定義類時被確定,而不是在執行類時。因此即使 我們在 Deseased 中調用 status, getStatus 在 Deseased 中被重載,self 始終指向 Person 中的 getStatus 函數。
對于靜態變量,同理
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();
輸出結果依舊是兩個 "Person is alive", 要想得到 "Person is deseased" 結果,只需把注釋部分去掉即可
綜上所述,php 通過在定義類時就確定 self 的作用域,使得靜態變量和方法不具備多態性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。