在淺談之前首先的跟大家聲明幾個(gè)重要的關(guān)鍵點(diǎn)幕侠!
THINKPHP(對(duì)比)
? _initialize()方法是在任何方法執(zhí)行之前,都要執(zhí)行的,當(dāng)然也包括_ _construct構(gòu)造函數(shù)。 也就是說(shuō)如果存在_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)用沒(méi)有關(guān)系扶檐。
? _ _construct這里是雙劃線凶杖,而_initialize()函數(shù)是單劃線
? 如果父子類均有_initialize()函數(shù),則子類覆蓋了父類的款筑,如果子類沒(méi)有而父類有智蝠,則子類繼承父類的。
? 默認(rèn)情況下奈梳,子類的構(gòu)造函數(shù)不會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù)寻咒。在調(diào)用子類對(duì)象的_initialize()時(shí),也不會(huì)導(dǎo)致自動(dòng)調(diào)用父類的_initialize()
? 實(shí)際編寫(xiě)子類的構(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。
原生PHP(對(duì)比)
1叫挟、_initialize()不是php類中的函數(shù)艰匙,php類的構(gòu)造函數(shù)只有__construct().
2、類的初始化:子類如果有自己的構(gòu)造函數(shù)(__construct()),則調(diào)用自己的進(jìn)行初始化抹恳,如果沒(méi)有员凝,則調(diào)用父類的構(gòu)造函數(shù)進(jìn)行自己的初始化。
3奋献、當(dāng)子類和父類都有__construct()函數(shù)的時(shí)候健霹,如果要在初始化子類的時(shí)候同時(shí)調(diào)用父類的__constrcut(),則可以在子類中使用parent::__construct().
如果我們寫(xiě)兩個(gè)類瓶蚂,如下
class Action{
public function __construct()
{
echo ‘hello Action’;
}
}
class IndexAction extends Action{
public function __construct()
{
echo ‘hello IndexAction’;
}
}
$test = new IndexAction;
很明顯初始化子類IndexAction的時(shí)候會(huì)調(diào)用自己的構(gòu)造器糖埋。
//所以這里輸出的是 — ?hello IndexAction
但是如果我們把上面的代碼修改一下的話又會(huì)得到另一種結(jié)果。
class Action{
public function __construct()
{
echo ‘hello Action’;
}
}
class IndexAction extends Action{
public function _initialize()
{
echo ‘hello IndexAction’;
}
}
$test = new IndexAction;
那么輸出的是 —‘hello Action’窃这。因?yàn)樽宇怚ndexAction沒(méi)有自己的構(gòu)造器瞳别。
如果我們?cè)诔跏蓟宇惖臅r(shí)候,同時(shí)調(diào)用父類的構(gòu)造器杭攻,那么結(jié)果將會(huì)兩句同時(shí)輸出锌奴。
代碼如下:
class Action{
public function __construct()
{
echo ‘hello Action’;
}
}
class IndexAction extends Action{
public function __construct()
{
parent::__construct();
echo ‘hello IndexAction’;
}
}
$test = new IndexAction;
輸出的結(jié)果是—‘hello Action’跟— ?hello IndexAction
在父類中調(diào)用子類的方法
class Action{
public function __construct()
{
if(method_exists($this,’hello’))
{
$this -> hello();
}
echo ‘hello Action’;
}
}
class IndexAction extends Action{
public function hello()
{
echo ‘hello IndexAction’;
}
}
$test = new Action;
這樣得到的結(jié)果也會(huì)跟上面的一樣檬嘀,兩句同時(shí)輸出
由此可見(jiàn)酸舍,這里子類中的方法hello()就類似于ThinkPHP中__initialize()亲雪。
所以,ThinkPHP中的_initialize()的出現(xiàn)只是方便程序員在寫(xiě)子類的時(shí)候避免頻繁的使用parent::__construct()锅睛,同時(shí)正確的調(diào)用框架內(nèi)父類的構(gòu)造器埠巨,所以,我們?cè)赥hnikPHP中初始化子類的時(shí)候要用_initialize(),而不用__construct(),當(dāng)然你也可以通過(guò)修改框架將_initialize()函數(shù)修改為你喜歡的函數(shù)名衣撬。