initialize php,THINKPHP的_initialize方法
1、PHP中只有__construct方法為構(gòu)造方法,會(huì)自動(dòng)執(zhí)行,_initialize方法本身不是構(gòu)造方法,不會(huì)自動(dòng)執(zhí)行,只是在thinkphp的Controller.class.php中我們可以看到如下代碼
public?function?__construct()?{
Hook::listen('action_begin',$this->config);
//實(shí)例化視圖類
$this->view?????=?Think::instance('Think\View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();
}
核心就在于method_exists這一段,典型的父類調(diào)用子類的一個(gè)方法。因此我們在有控制器繼承Controller.class.php的時(shí)候,例如BaseController.class.php定義了_initialize方法,則會(huì)在初始化BaseController這個(gè)類的時(shí)候自動(dòng)去調(diào)用_initialize方法。
2、我們經(jīng)常會(huì)看到很多代碼繼承關(guān)系比較復(fù)雜,例如
a、ProjectController.class.php
class?ProjectController?extends?UcenterBaseController{
protected?function?_initialize(){
$this->model?=?new?ProjectModel();
parent::_initialize();
}
b、UcenterBaseController.class.php
class?UcenterBaseController?extends?FrontendBaseController{
protected?function?_initialize(){
decide_terminal();
$this->tablePrefix?=?C('DB_PREFIX');
parent::_initialize();
c、FrontendBaseController.class.php
class?FrontendBaseController?extends?BaseController
{
/**
*?初始化入口
*/
protected?function?_initialize()
{
parent::_initialize();
if(APP_NAME?==?'study')?{
set_theme(C('STUDY_THEME'));
}?else?{
set_theme(C('SITE_INFO.templet'));
}
}
d、BaseController.class.php
class?BaseController?extends?Controller?{
/**
*?初始化入口
*/
protected?function?_initialize()?{
decide_terminal();
decide_site();
可能大家在碰到這種繼承關(guān)系的時(shí)候比較暈,多重繼承究竟執(zhí)行的是哪個(gè)_initialize方法,這個(gè)大家都需要注意php的第二個(gè)特性,如果父子類均有_initialize()函數(shù),則子類覆蓋了父類的,如果子類沒有而父類有,則子類繼承父類的。在調(diào)用子類對象的_initialize()時(shí),不會(huì)導(dǎo)致自動(dòng)調(diào)用父類的_initialize(),我們必須顯示的用parent::_initialize()來調(diào)用父類的方法。也就是說程序在初始化Project.class.php方法的時(shí)候,發(fā)現(xiàn)這個(gè)類有了_initialize方法,則不會(huì)自動(dòng)去執(zhí)行父類UcenterBaseController的,直接執(zhí)行自己定義的的_initialize,然后_initialize中有parent::_initialize()再去執(zhí)行UcenterBaseController的_initialize方法,這個(gè)里面再調(diào)用parent::_initialize執(zhí)行。需要注意的一點(diǎn)是:在BaseController.class.php中不要寫parent::_initialize,會(huì)直接報(bào)錯(cuò)的,因?yàn)镃ontroller.class.php中沒有_initialize方法
3、總結(jié)
(1)_initialize()函數(shù)是在任何方法執(zhí)行之前,都要執(zhí)行的,當(dāng)然也包括_ _construct構(gòu)造函數(shù),注意,_ _construct這里是雙劃線,而_initialize()函數(shù)是單劃線。
(2)如果父子類均有_initialize()函數(shù),則子類覆蓋了父類的,如果子類沒有而父類有,則子類繼承父類的。在調(diào)用子類對象的_initialize()時(shí),不會(huì)導(dǎo)致自動(dòng)調(diào)用父類的_initialize()。
(3)默認(rèn)情況下,子類的構(gòu)造函數(shù)也不會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù),這一點(diǎn)與Java不同。實(shí)際編寫子類的構(gòu)造函數(shù)時(shí),一般都要加上父類構(gòu)造函數(shù)的主動(dòng)調(diào)用 parent::_ _construct(),否則會(huì)導(dǎo)致子類對象空指針的異常,如Call to a member function assign() on a non-object。
(4)_initialize()函數(shù)是在“任何”方法調(diào)用之前都要調(diào)用的,也就是說如果存在_initialize()函數(shù),調(diào)用對象的任何方法都會(huì)導(dǎo) 致_initialize()函數(shù)的自動(dòng)調(diào)用,而_ _construct構(gòu)造函數(shù)僅僅在創(chuàng)建對象的時(shí)候調(diào)用一次,跟其它方法調(diào)用沒有關(guān)系。
總結(jié)
以上是生活随笔為你收集整理的initialize php,THINKPHP的_initialize方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BlackBerry Internet
- 下一篇: 《VoIP技术构架(第2版·修订版)》一