国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php面向對象程序設計中self與static的區別分析

2024-05-05 00:09:10
字體:
來源:轉載
供稿:網友

本文實例講述了php面向對象程序設計中self與static的區別。分享給大家供大家參考,具體如下:

1、假設我們有個Car類,它有2個方法:model()getModel()

class Car{ public function model(){  //這里我們使用了關鍵字self  self::getModel(); } protected function getModel(){  echo 'I am car'; }}

實例化后調用方法:

$car = new Car();$car->model(); // 輸出:I am car

關鍵字self使得我們調用了Car類的getModel()方法,輸出了文本“I am car”。

2、添加一個新類作為Car類的子類:

class Mercedes extends Car{ protected function getModel() {  echo "I am mercedes"; }}// 實例化后 調用model()方法$mercedes = new Mercedes();$mercedes->model();

我們知道子類會繼承父類的方法,我們在子類Mercedes中重寫了getModel()方法。
這時候實例化Mercedes類調用model()方法,會輸出字符串"I am car" 還是“I am mercedes”?

你可能會覺得結果是:I am mercedes。

但實際輸出是:

I am car

why?

3、關鍵字self的工作原理是:它會調用當前類的方法

因為model()方法只在Car類中定義的,所以對self來說當前類就是Car類。self::getModel()就是調用Car類中的getModel方法。

這似乎不是我們想要的,如何解決呢?

4、解決方案一:在Mercedes類中覆蓋model()方法

class Mercedes extends Car{ public function model(){  //這里我們使用了關鍵字self  self::getModel(); } protected function getModel() {  echo "I am mercedes"; }}// 實例化后 調用model()方法$mercedes = new Mercedes();$mercedes->model(); // 輸出:I am mercedes

但這肯定不是好辦法啊,方法都重寫了,還繼承個毛啊。

5、解決方案二:把self關鍵字換成static

class Car{ public function model(){  //這里我們使用了關鍵字static  static::getModel(); } protected function getModel(){  echo 'I am car'; }}

我們只是將Car類中的self替換成了static,并未對Mercedes類作修改。

此時我們調用:

$mercedes = new Mercedes();$mercedes->model(); // 輸出:I am mercedes

6、小結

在php5.3中加入了一個新特性,叫做延遲靜態綁定。可以幫我們實現多態

簡單說,延遲靜態綁定意味著,當我們使用static關鍵字調用一個繼承方法時,它將在運行時才綁定調用類

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 日土县| 逊克县| 辉县市| 如东县| 庆元县| 深圳市| 双桥区| 铅山县| 苍山县| 西乌珠穆沁旗| 新和县| 五寨县| 武定县| 莱阳市| 墨竹工卡县| 英吉沙县| 饶阳县| 新绛县| 福海县| 米脂县| 蓝山县| 柳河县| 民勤县| 喀什市| 项城市| 肇州县| 永德县| 康平县| 克东县| 穆棱市| 大悟县| 英德市| 永清县| 南华县| 阳新县| 灯塔市| 荥经县| 怀来县| 韶山市| 杂多县| 普洱|