__construct:
类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化。
比如我们写一个控制器继承THINK中的Controller,代码如下:
class IndexController extends Controller {
public function __construct()
{
parent::__construct();
if(!isset($_SESSION['adminname']))
{
$this->redirect('/Admin/Login/index',NULL,4,'Login first!');
}
}
public function index()
{
$this->display();
}
}
你会发现报一个
Call to a member function display() on a non-object
的错。这是因为子类控制器走了自己的__construct方法,而不走框架中Controller的__construct方法,因而无法加载。要在子类中走父类的方法,只需在子类构造方法中加一句代码:
parent::__construct().这句代码作用就是走父类构造方法。再调试,报错没有了。
让我们继续深入探究,
父类Controller中的代码如下:
public function __construct() {
Hook::listen('action_begin',$this->config);
//实例化视图类
$this->view = Think::instance('Think\View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();
}
Hook::listen('action_begin',$this->config);
//实例化视图类
$this->view = Think::instance('Think\View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();
}
你会发现因为走了子类的构造方法因而无法走父类构造方法,因而无法加载视图。另外,代码最后两句, 走了子类中的__initialize方法。故, __initialize方法的存在是为了避免在子类中频繁调用父类__construct方法,用__initialize方法就能自动调用,在子类中也能自动走__initialize方法