簡單談?wù)刾hp延遲靜態(tài)綁定
使用場景
先來觀察以下代碼:
abstract class base {
//do sth
}
class aClass extends base{
public static function create(){
return new aClass();
}
}
class bClass extends base{
public static function create(){
return new bClass();
}
}
var_dump(aClass::create());
var_dump(bClass::create());
輸出:
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
以上aClass和bClass繼承于base這個抽象類,但是在兩個子類中同時實現(xiàn)了create()這個靜態(tài)方法。遵從oop思想,這種重復(fù)代碼應(yīng)該放在base這個父類中實現(xiàn)。
改進代碼
abstract class base {
public static function create(){
return new self();
}
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());
現(xiàn)在的代碼看起來好像已經(jīng)符合我們之前的想法,將create()方法放在父類里共用了,那我們來運行下看會發(fā)生什么。
Cannot instantiate abstract class base in ...
很遺憾,代碼好像并沒有按照我們預(yù)想的那樣去運行,父類中的self()被解析為base這個父類,并非繼承與他的子類。于是為了解決這個問題,php5.3中引入了延遲靜態(tài)綁定這個概念。
延遲靜態(tài)綁定
abstract class base {
public static function create(){
return new static();
}
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());
這個代碼與之前的幾乎一致,不同點在于將self換成了static這個關(guān)鍵字,static會解析為子類,而非父類,這樣就可以解決上面遇到的問題,這就是php的延遲靜態(tài)綁定。
最后,運行一下代碼,得到了最終想要的結(jié)果。
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
相關(guān)文章
laravel excel 上傳文件保存到本地服務(wù)器功能
今天小編就為大家分享一篇laravel excel 上傳文件保存到本地服務(wù)器功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Codeigniter出現(xiàn)錯誤提示Error with CACHE directory的解決方案
這篇文章主要介紹了Codeigniter出現(xiàn)錯誤提示Error with CACHE directory的解決方案,需要的朋友可以參考下2014-06-06
php控制linux服務(wù)器常用功能 關(guān)機 重啟 開新站點等
服務(wù)器主機是CentOS 的,每次重啟、關(guān)機都得通過客戶端連接,想問下能否通過PHP頁面實現(xiàn)對系統(tǒng)的 關(guān)機、重啟操作2012-09-09
tp5框架使用composer實現(xiàn)日志記錄功能示例
這篇文章主要介紹了tp5框架使用composer實現(xiàn)日志記錄功能,結(jié)合實例形式分析了thinkPHP5框架composer安裝及日志記錄相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
php中通過curl模擬登陸discuz論壇的實現(xiàn)代碼
PHP支持的由Daniel Stenberg創(chuàng)建的libcurl庫允許你與各種的服務(wù)器使用各種類型的協(xié)議進行連接和通訊。libcurl目前支持http、https、ftp、 gopher、telnet、dict、file和ldap協(xié)議2012-02-02

