最近在學習ThinkPHP架構,看到_initialize()函數,也正好做個小總結
簡單看了Google,百度上的教程,感覺劈裡啪啦說了好多,全在進行測試,都沒說到點子上~
實驗版本:ThinkPHP 3.2.3,PHP5.6。
_initialize()函數的出現是為了我們可以在子類中同時調用父類與子類的建構函式。
想要搞明白最簡單方法的就是開啟TP的源碼,最靠譜。
路徑:ThinkPHP3.2.3/ThinkPHP/Library/Think/Controller.class.php.(△Controller是一個抽象類別△)
我們可以看到:
在此處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()中進行處理:
if(method_exists($this,’_initialize’)){$this -> _initialize();}
兩者都不能被子類覆蓋重寫,否則父子類同時調用的功能將會失效
就目前而言(ThinkPHP3.2.3)中,_initialize()是有漏洞的,畢竟還需要我們在手動進行一次處理,這樣的話_initialize()的作用就剩下命名約束了,因為只要願意的話完全可以將_initialize改成其他命名,相信官方在後期版本會改進這個函數。
以上就介紹了從ThinkPHP源碼講解_initialize與__construct,包括了initialize,construct方面的內容,希望對PHP教程有興趣的朋友有所協助。