簡單談談php延遲靜態繫結

2022-10-06 09:45:09 字數 1105 閱讀 7007

使用場景

先來觀察以下**:

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在這...