摘要:函數(shù)的出現(xiàn)是為了我們可以在子類(lèi)中同時(shí)調(diào)用父類(lèi)與子類(lèi)的構(gòu)造函數(shù)。而在父類(lèi)經(jīng)過(guò)特別處理后,本身就就可以完成這個(gè)功能了,其實(shí)我認(rèn)為的函數(shù)本意就是用來(lái)在需要同時(shí)調(diào)用父類(lèi)與子類(lèi)構(gòu)造函數(shù)時(shí)用的。
最近在學(xué)習(xí)ThinkPHP框架,看到_initialize()函數(shù),也正好做個(gè)小總結(jié)
簡(jiǎn)單看了谷歌,百度上的教程,感覺(jué)噼里啪啦說(shuō)了好多,全在進(jìn)行測(cè)試,都沒(méi)說(shuō)到點(diǎn)子上~
實(shí)驗(yàn)版本:ThinkPHP 3.2.3,PHP5.6。
_initialize()函數(shù)的出現(xiàn)是為了我們可以在子類(lèi)中同時(shí)調(diào)用父類(lèi)與子類(lèi)的構(gòu)造函數(shù)。
想要搞明白最簡(jiǎn)單方法的就是打開(kāi)TP的源碼,最靠譜。
路徑:ThinkPHP3.2.3/ThinkPHP/Library/Think/Controller.class.php.(△Controller是一個(gè)抽象類(lèi)△)
我們可以看到:
在此處Controller這個(gè)抽象類(lèi)重寫(xiě)了__construct()方法,重點(diǎn)看看三條紅線(xiàn),這里就是_initialize()的全部,其實(shí)壓根沒(méi)有特別聲明一個(gè)_initialize()方法然后賦予它特別的功能。
可以看出,_initialize()具備構(gòu)造函數(shù)的功能純粹是因?yàn)樗迷赺_construct()里而已(當(dāng)實(shí)例化類(lèi)時(shí),構(gòu)造函數(shù)__construct運(yùn)行,如果當(dāng)前類(lèi)存在_initialize()方法,順帶執(zhí)行了_initialize())
我們看下在原生PHP中如何完成同時(shí)調(diào)用子類(lèi)父類(lèi)構(gòu)造函數(shù)需求的。
那么在ThinkPHP中呢?(不要在意格式)
原生代碼想要完成需求需要在子類(lèi)中調(diào)用運(yùn)行parent::__construct()。
而ThinkPHP在父類(lèi)經(jīng)過(guò)特別處理后,_initialize()本身就就可以完成這個(gè)功能了,其實(shí)我認(rèn)為T(mén)hinkPHP的_initialize函數(shù)本意就是用來(lái)在需要同時(shí)調(diào)用父類(lèi)與子類(lèi)構(gòu)造函數(shù)時(shí)用的。
總結(jié)一下在TP中_initialize()和__construct()使用的注意事項(xiàng)
如果_initialize()和__construct()同時(shí)出現(xiàn)的話(huà),那么_initialize()將會(huì)無(wú)效,因?yàn)榇藭r(shí)__construct()已經(jīng)重寫(xiě),不再調(diào)用_initialize()。
如果想要父子類(lèi)構(gòu)造函數(shù)同時(shí)調(diào)用,一定要在父類(lèi)的__construct()中進(jìn)行處理:
if(method_exists($this,’_initialize’)){ $this -> _initialize(); }
兩者都不能被子類(lèi)覆蓋重寫(xiě),否則父子類(lèi)同時(shí)調(diào)用的功能將會(huì)失效
就目前而言(ThinkPHP3.2.3)中,_initialize()是有漏洞的,畢竟還需要我們?cè)谑謩?dòng)進(jìn)行一次處理,這樣的話(huà)_initialize()的作用就剩下命名約束了,因?yàn)橹灰敢獾脑?huà)完全可以將_initialize改成其他命名,相信官方在后期版本會(huì)改進(jìn)這個(gè)函數(shù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21503.html
摘要:延伸如果子類(lèi)繼承了父類(lèi)后,重寫(xiě)了構(gòu)造方法,注意調(diào)用父類(lèi)的哦,否則是使用不了的,代碼如下其他代碼總結(jié)一個(gè)簡(jiǎn)單的小設(shè)計(jì),這里拋磚引玉的分析下,希望對(duì)大家有幫助。 前言 _initialize() 這個(gè)方法在官方手冊(cè)里是這樣說(shuō)的: 如果你的控制器類(lèi)繼承了 hinkController類(lèi)的話(huà),可以定義控制器初始化方法_initialize,在該控制器的方法調(diào)用之前首先執(zhí)行。 其實(shí)不止5,在之前...
摘要:以上是服務(wù)啟動(dòng)過(guò)程中的主體設(shè)計(jì),其中包括了各種組件的實(shí)例化,如對(duì)象池等。 EasySwoole 服務(wù)啟動(dòng)過(guò)程以及主體設(shè)計(jì)流程源碼解析 本文主要講解EasySwoole 服務(wù)的啟動(dòng)過(guò)程,會(huì)通過(guò)源碼片段講解主體的設(shè)計(jì)流程 命令啟動(dòng) 當(dāng)我們通過(guò)php easyswoole start啟動(dòng)EasySwoole 服務(wù)時(shí),命令真正到達(dá)的文件是 easyswoole項(xiàng)目vendoreasyswool...
摘要:源碼分析錯(cuò)誤及異常處理機(jī)制錯(cuò)誤及異常處理機(jī)制文件是,在框架引導(dǎo)文件的的基礎(chǔ)文件中注冊(cè)不知道的可以去看源碼分析二入口篇,通過(guò)進(jìn)行的注冊(cè)。異常中止處理將錯(cuò)誤信息托管至寫(xiě)入日志通過(guò)獲取最后拋出的錯(cuò)誤,把信息托管至,在通過(guò)異常處理函數(shù)進(jìn)行記錄信息。 源碼分析 錯(cuò)誤及異常處理機(jī)制 錯(cuò)誤及異常處理機(jī)制文件是/thinkphp/library/think/Error.php,在框架引導(dǎo)文件的的基礎(chǔ)文...
摘要:使用微信企業(yè)號(hào)回調(diào)的坑最近在做企業(yè)號(hào)回調(diào)的接口,之前做過(guò)幾個(gè)企業(yè)號(hào)的應(yīng)用了,每次接入到都報(bào)各種各樣的錯(cuò)誤,算哥倒霉,該踩的不該踩的坑全踩了。 ThinkPHP 使用微信企業(yè)號(hào)回調(diào)的坑 最近在做企業(yè)號(hào)回調(diào)的接口,之前做過(guò)幾個(gè)企業(yè)號(hào)的應(yīng)用了,每次接入到Thinkphp都報(bào)各種各樣的錯(cuò)誤,算哥倒霉,該踩的不該踩的坑全踩了。 這次掉坑里差點(diǎn)就放棄了,開(kāi)發(fā)過(guò)企業(yè)號(hào)的都知道,企業(yè)號(hào)回調(diào)會(huì)經(jīng)過(guò)一個(gè)...
摘要:方法是在任何方法執(zhí)行之前,都要執(zhí)行的,當(dāng)然也包括構(gòu)造函數(shù)。也就是說(shuō)如果存在函數(shù),調(diào)用對(duì)象的任何方法都會(huì)導(dǎo)致函數(shù)的自動(dòng)調(diào)用而構(gòu)造函數(shù)僅僅在創(chuàng)建對(duì)象的時(shí)候調(diào)用一次,跟其它方法調(diào)用沒(méi)有關(guān)系。默認(rèn)情況下,子類(lèi)的構(gòu)造函數(shù)不會(huì)自動(dòng)調(diào)用父類(lèi)的構(gòu)造函數(shù)。 _initialize()方法是在任何方法執(zhí)行之前,都要執(zhí)行的,當(dāng)然也包括 __construct構(gòu)造函數(shù)。 也就是說(shuō)如果存在_initializ...
閱讀 2481·2021-11-19 09:59
閱讀 2005·2019-08-30 15:55
閱讀 938·2019-08-29 13:30
閱讀 1342·2019-08-26 10:18
閱讀 3091·2019-08-23 18:36
閱讀 2394·2019-08-23 18:25
閱讀 1168·2019-08-23 18:07
閱讀 441·2019-08-23 17:15