使用場景
先來觀察以下**:
abstr程式設計客棧act class base
class aclass extends base
}class bclass extends base
}var_dump(aclass::create());
var_dump(bclass::create());
輸出:object(aclass)#1 (0) obje程式設計客棧ct(bclass)#1 (0)
以上aclass和bclass繼承於base這個抽象類,但是在兩個子類中同時實現了create()這個靜態方法。遵從oop思想,這種重複**應該放在base這個父類中實現。
改進**
abstract class base
}class aclass extends base
class bclass extends base
var_dump(aclass::create());
var_dump(
現在的**看起來好像已經符合我們之前的想法,將create()方法放在父類裡共用了,那我們來執行下看會發生什麼。
cannot instantiate abstract class base in ...
很遺憾,**好像並沒有按照我們預想的那樣去執行,父類中的self()被解析為base這個父類,並非繼承與他的子類。於是為了解決這個問題,php5.3中引入了延遲靜態繫結這個概念。
延遲靜態繫結
abstract class bas程式設計客棧e
}class aclass extends base
class bclass extends base
var_dump(
var_dump(bclass::create());
這個**與之前的幾乎一致,不同點在於將self換成了static這個關鍵字,static會解析為子類,而非父類,這樣就可以解決上面遇到的問題,這就是php的延遲靜態繫結。
最後,執行一下**,得到了最終想要的結果。
object(aclass)#1 (0) object(bclass)#1 (0)
本文標題: 簡單談談php延遲靜態繫結
本文位址:
PHP延遲靜態繫結
1 self用法 self是指向定義它的當前類的指標。當前類 current class class person 獲取年齡 public static function getage 輸出 self name i am person self age 18 2 static用法 static是指向...
PHP延遲靜態繫結
所謂延遲靜態繫結,顧名思義,靜態呼叫時 符號左側的部分的的繫結是延遲,也就是說不再被解析為定義當前方法所在的類,而是在實際執行時計算的。class people public static function eat class fatguy extends people public static ...
PHP靜態延遲繫結
php版本5.3起增加了靜態延遲繫結,也稱遲繫結,主要用於在繼承範圍內引用靜態呼叫的類。簡單地來說 static 不再被解析為當前方法所定義的類,而是在實際執行時計算的。意外的繼承 class person class man extends person echo man say person在這...