thinkphp 中_initialize和__construct的区别

最近在模仿写一个权限管理系统,其中在继承AuthController中用到了_initialize。

class AuthController extends Controller {
    protected function _initialize(){
    }
}

首先,_initialize并非php类中的函数,它是由Think\Controller.class.php实现的一个构造函数方法
我们看看源码

 public function __construct() {
        Hook::listen('action_begin',$this->config);
        //实例化视图类
        $this->view     = Think::instance('Think\View');
        //控制器初始化
        if(method_exists($this,'_initialize'))
            $this->_initialize();
    }

从上面可以看出在实例化父类的Controller后,如果子类中存在_initialize方法时,则执行。
此时_initialize相当于子类的构造函数。

那么子类中可不可以用__construct充当构造函数呢?
当在子类中使用__construct的时候,相当于重载了父类的 __construct方法,故父类的构造函数不执行。
所以在子类中要加载父类的构造函数。

class AuthController extends Controller{
    public function __construct(){
        parent::__construct();
}

通过使用_initialize方法来简化从父类执行构造函数的步骤以及避免忘了初始化父类的执行函数。

我们接下来看一下当父类和子类都有_initialize的情况

AuthController.class.php

class AuthControlle extends Controller {
    public function _initialize(){
        $parent ='parent';
        $this->assign('parent',$parent);
    }
}

IndexController.class.php

class IndexController extends AuthController{
    public function _initialize() {
        parent::_initialize();
    }

    public function index(){
        $child = "child";
        $this->assign('child',$child);
        $this->display();
    }
}

页面同时输出了parent和child,其中虽然IndexController重载了父类AuthController中的_initialize,但在自身的_initialize中加载了父类的静态方法,故会输出parent,不能写成parent:_construct, 会引起500错误。

你可能感兴趣的:(thinkphp)