日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

initialize php,THINKPHP的_initialize方法

發(fā)布時(shí)間:2023/12/18 php 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 initialize php,THINKPHP的_initialize方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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è)方法。因此我們?cè)谟锌刂破骼^承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)用子類對(duì)象的_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)用子類對(duì)象的_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)致子類對(duì)象空指針的異常,如Call to a member function assign() on a non-object。

(4)_initialize()函數(shù)是在“任何”方法調(diào)用之前都要調(diào)用的,也就是說如果存在_initialize()函數(shù),調(diào)用對(duì)象的任何方法都會(huì)導(dǎo) 致_initialize()函數(shù)的自動(dòng)調(diào)用,而_ _construct構(gòu)造函數(shù)僅僅在創(chuàng)建對(duì)象的時(shí)候調(diào)用一次,跟其它方法調(diào)用沒有關(guān)系。

總結(jié)

以上是生活随笔為你收集整理的initialize php,THINKPHP的_initialize方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。