<?phpphp
class FatherAction extends Action{
public function __construct(){
echo 'father';
}
}函數
?>測試
建立的SonAction.class.php文件this
<?phpit
class SonAction extends FatherAction{
public function __construct(){
echo 'son';
}
function index(){io
}
}function
?>class
輸出「son」構造函數
若是將子類改成:方法
<?php
class SonAction extends FatherAction{
public function __construct(){
parent::__construct();
echo 'son';
}
function index(){
}
}
?>
輸出「fatherson」.
上面的結果能夠得出結論:
在執行子類的構造函數時並不會自動調用父類的構造函數,若是你要調用的話,那麼要加上parent::__construct()
當咱們把上述的構造方法改成THINKPHP_initialize()方法時運行會發現:結果與前面的一致,若要執行父類的_initialize()方法,也須要使用這一句:
parent::_initialize()那是否是說明php自帶的構造函數__construct()與THINKPHP的_initialize()方法同樣的呢?
先貼上兩段代碼:
<?php
class FatherAction extends Action{
public function __construct(){
echo 'father';
}
}
?>
<?php
class SonAction extends FatherAction{
public function _initialize(){
echo 'son';
}
function index(){
}
}
?>輸出的結果爲:father.即子類調用了父類的構造函數,而沒有調用子類的_initialize()方法
再貼上兩段代碼:
<?php
class FatherAction extends Action{
public function __construct(){
if(method_exists($this,"hello")){
$this->hello();
}
echo 'father';
}
}
?>
<?php
class SonAction extends FatherAction{
public function _initialize(){
echo 'son';
}
function index(){
}
function hello(){
echo 'hello';
}
}
?>執行子類SonAction的index方法,發現輸入的結果爲hellofather
由此能夠得出結論:
當THINKPHP的父類有構造函數而子類沒有時,THINKPHP不會去執行子類的_initialize();
當THINKPHP的父類子類均有構造函數時,要調用父類的構造函數必須使用parent::__construct()-----------------_initialize()同理;
當THINKPHP的子類同時存在__construct構造函數和_initialize()方法,只會執行子類的__construct構造函數(這個上述代碼沒有,能夠本身測試)。