最近部門趕項目在做一個微商城,在做後臺時,做用戶信息功能這塊,出現一個問題,就是在public/header 文件中,需要在頭部顯示用戶姓名和狀態,底層寫了個base控制器,控制器中判斷用戶是否登錄,並將用戶信息assign到頁面,所有(除了login)控制器都繼承這個base控制器,但在渲染時,發現所有模塊下都無法識別username ,想來想去,一直找不到原因,後來,突然靈機一動,發現父類base控制器和子控制器中都有一個_initialize()這個構造函數,理論上說,若子類中方法與父類中的方法同名,在子類中是會重載這個方法的,所以,之前assign 的username變量所在的方法一遍重載,根本不存在,要想使 兩個同名方法都起作用,需要在子類_initialize()方法中添加:
parent::_initialize();
舉個例子:
創建的FatherAction.class.php文件
<?php
class FatherAction extends Action{
public function __construct(){
echo 'father';
}
}
?>
創建的SonAction.class.php文件
<?php
class SonAction extends FatherAction{
public function __construct(){
echo 'son';
}
function index(){
}
}
?>
運行子類SonAction裏的index()可以看到輸出的結果:
son
如果將子類改爲:
<?php
class SonAction extends FatherAction{
public function __construct(){
parent::__construct();
echo 'son';
}
function index(){
}
}
?>
運行結果爲;
fatherson
上面的結果可以得出結論:
在執行子類的構造函數時並不會自動調用父類的構造函數,如果你要調用的話,那麼要加上parent::__construct()
當我們把上述的構造方法改爲THINKPHP_initialize()方法時運行會發現:結果與前面的一致,若要執行父類的_initialize()方法,也需要使用這一句:
parent::_initialize()