最近在學習ThinkPHP框架,看到_initialize()函數,也正好做個小總結
簡單看了谷歌,百度上的教程,感覺噼裡啪啦說了好多,全在進行測試,都沒說到點子上~
實驗版本:ThinkPHP 3.2.3,PHP5.6。
_initialize()函數的出現是為了我們可以在子類別中同時呼叫父類別與子類別的建構子。
想要搞懂最簡單方法的就是開啟TP的來源碼,最可靠。
路徑:ThinkPHP3.2.3/ThinkPHP/Library/Think/Controller.class.php.(△Controller是抽象類別△)
我們可以看到:
在這個抽象類別中重寫了__construct()方法,重點看看三條紅線,這裡就是_initialize()的全部,其實壓根沒有特別宣告一個_initialize()方法然後賦予它特別的功能。
可以看出,_initialize()具備建構函數的功能純粹是因為它正好在__construct()裡而已(當實例化類別時,建構子__construct運行,如果當前類別存在_initialize()方法,順帶執行了_initialize())
我們看下在原生PHP中如何完成同時呼叫子類別父類別建構子需求的。
那麼在ThinkPHP呢?
原生程式碼想要完成需求需要在子類別中呼叫運行parent::__construct()。
而ThinkPHP在父類經過特別處理後,_initialize()本身就可以完成這個功能了,其實我認為ThinkPHP的_initialize函數本意就是用來在需要同時調用父類與子類構造函數時用的。
總結一下在TP中_initialize()和__construct()使用的注意事項
如果_initialize()和__construct()同時出現的話,那麼_initialize()將會無效,因為此時__construct()已經重寫,不再呼叫_initialize()。
如果想要父子類構造函數同時調用,一定要在父類的__construct()中進行處理:
<code>if(method_exists($this,’_initialize’)){ $this -> _initialize(); } </code>
兩者都不能被子類覆蓋重寫,否則父子類同時調用的函數將會失效
就目前而言(ThinkPHP3.2.3)中,_initialize()是有漏洞的,畢竟還需要我們在手動進行一次處理,這樣的話_initialize()的作用就剩下命名約束了,因為只要願意的話完全可以將_initialize改成其他命名,相信官方在後期版本會改進這個函數。
以上就介紹了從ThinkPHP原始碼講解_initialize與__construct,包括了initialize,construct方面的內容,希望對PHP教程有興趣的朋友有所幫助。