摘要:于是為了解決這個問題,中引入了延遲靜態綁定這個概念。延遲靜態綁定這個代碼與之前的幾乎一致,不同點在于將換成了這個關鍵字,會解析為子類,而非父類,這樣就可以解決上面遇到的問題,這就是的延遲靜態綁定。
使用場景
先來觀察以下代碼:
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這個抽象類,但是在兩個子類中同時實現了create()這個靜態方法。遵從oop思想,這種重復代碼應該放在base這個父類中實現。
改進代碼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());
現在的代碼看起來好像已經符合我們之前的想法,將create()方法放在父類里共用了,那我們來運行下看會發生什么。
Cannot instantiate abstract class base in ...
很遺憾,代碼好像并沒有按照我們預想的那樣去運行,父類中的self()被解析為base這個父類,并非繼承與他的子類。于是為了解決這個問題,php5.3中引入了延遲靜態綁定這個概念。
延遲靜態綁定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這個關鍵字,static會解析為子類,而非父類,這樣就可以解決上面遇到的問題,這就是php的延遲靜態綁定。
最后,運行一下代碼,得到了最終想要的結果。
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
[參考文獻]深入PHP面向對象、模式與實踐
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30284.html
摘要:判斷是否存在構造函數,不存在直接實例化,存在則通過來獲取輸入函數,并有相應的方法解決依賴參數問題,實現依賴注入。 Laravel 框架關鍵技術解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數的添加 服務器實例化與服務注冊 路由加載 請求實例化與路由分發 相應生成與發送 其中,自動加載函數用于包含引用文件,改文件是composer...
摘要:總結本文主要學習了啟動時做的七步準備工作環境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學習相關源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...
摘要:函數內的變量靜態變量的理解靜態變量類型說明符是。靜態變量雖在程序的整個執行過程中始終存在,但是在它作用域之外不能使用。靜態變量并不是說其就不能改變值,不能改變值的量叫常量。 函數內的static變量 static靜態變量的理解 靜態變量 類型說明符是static。靜態變量屬于靜態存儲方式,其存儲空間為內存中的靜態數據區(在 靜態存儲區內分配存儲單元),該區域中的數據在整個程序的運行期間...
摘要:靜態方法和屬性靜態方法是以類作為作用域的函數。靜態方法不能訪問這個類中的普通屬性,因為那些屬性屬于一個對象,但可以訪問靜態屬性。因此靜態方法和屬性又被稱為類變量和屬性,也就不能在靜態方法中使用偽變量。引入了延遲靜態綁定的概念。 靜態方法和屬性 靜態方法是以類作為作用域的函數。靜態方法不能訪問這個類中的普通屬性,因為那些屬性屬于一個對象,但可以訪問靜態屬性。如果修改了一個靜態屬性,那么這...
摘要:如上為三個模塊行為行為是在預先定義好的一個應用位置執行的一些操作。發生作用的位置稱之為鉤子,當應用程序運行到這個鉤子的時候,就會被攔截下來,統一執行相關的行為。給某一個鉤子綁定相關行為就成了一種類編程的思想。 ThinkPhp5.0 Composer: php世界里的包管理器 目錄結構 project 應用部署目錄 ├─application 應用目錄(可設置) ...
閱讀 1829·2021-09-22 15:55
閱讀 3521·2021-09-07 10:26
閱讀 628·2019-08-30 15:54
閱讀 684·2019-08-29 16:34
閱讀 839·2019-08-26 14:04
閱讀 3258·2019-08-26 11:47
閱讀 2134·2019-08-26 11:33
閱讀 2294·2019-08-23 15:17