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

