11:類常量魔術變數、抽象類與延遲繫結
阿新 • • 發佈:2018-12-24
常量、類常量、魔術變數
-
普通常量:define(‘常量名’,‘常量值’);
- 全域性可訪問
- 值不可改變
-
類常量:const 常量名 = 常量值;
- 在PHP7中
- 類內可以訪問,類外則根據許可權的不同而定
- 他與靜態屬性類似,唯一區別就是:值不可改變
- 宣告時不用加
$
符號
-
魔術變數
-
兩個特點:
-
無法手動修改這個變數的值
-
魔術變數的值是隨著環境的變動而改變的
-
魔術變數很多,它們的作用很大,能在開發中幫助你快速高效的解決一些問題,所以請認真的翻閱一遍手冊,對魔術變數都有那些,有一個大概的認知;
-
幾個小示例
define('br','<br/>'); echo '當前正在執行的是:',__FILE__,'檔案'; echo br; echo '當前在',__DIR__,'目錄下'; echo br; class A { static function say(){ echo '當前類名為:',__CLASS__; } } A::say();//當前類名為:A
-
延遲繫結
-
問題描述:
- 父類有一個
靜態公共的A方法
和一個靜態公共的B方法
; - 子類有一個
靜態公共的A方法
; - 靜態呼叫子類的B方法,此時,輸出什麼?
- 父類有一個
-
程式碼示例:
class A{
static function haha(){
echo '我是父類的haha方法';
}
static function hehe(){
self::haha();
}
}
class B extends A{
static function haha(){
echo '我是子類的haha方法';
}
}
B::haha();
-
結果:輸出父類haha的echo;
-
原因:因為self所在的位置是父類,
-
但是!當
self
換成static
時,結果就不一樣了,換成static
-
為什麼?
-
因為
self
僅代表當前類,如果當前類沒有,就是沒有,報undefined; -
而
static
則是:如果子類有,就用子類的,如果子類沒有,就用我自己的,如果子類也沒有,我也沒有,那就報錯,undefined; -
上面的程式碼,
self
換成static
之後,則優先使用子類的haha方法,如果子類沒有haha方法,則使用父類的haha方法; -
static會一直向上找,子類沒有,我自己也沒有,就向本類的父類找,向本類的父類的父類找,最終沒有就報錯;
抽象類
抽象類的定義
-
就是對類進行抽象
-
類前加
abstract
就是抽象類 -
方法前加
abstract
就是抽象方法 -
抽象方法不能有方法體
-
抽象類,不能被New例項化
-
有抽象方法的類都是抽象類
-
抽象類內不一定有抽象方法
-
抽象類其實就是起到了一個類模板,類的規範的作用;
抽象類的意義
- 抽象類是不完整的,它的剩餘功能是由子類來完成的
- 也就是說,抽象類這個概念的存在,我們可以用於規範方法,生成一個類的模板,供大家比對著模板去寫自己的方法
- 中小型專案中,或者說團隊人員較少的情況下,為了迅速的開發,抽象類這些什麼規範是被摒棄的,如果你時間足夠多,你可以嘗試在多人協作的時候使用這些規範化的東西;
延遲繫結
- 是指類的self的指向,不是以定義時為準,而是在執行時的計算結果為準;
- 其實延期繫結很簡單,就是執行時的指向;
- 只要區分了self 和static 的區別就OK,self主要是隻在本類找,而static是先從例項化物件的類中開始找,沒有就向父級找,找到最終類還沒找到,就報錯;就這麼簡單;