thinkphp 中_initialize和__construct的区别

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

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至关于子类的构造函数。this

那么子类中可不能够用__construct充当构造函数呢? 
当在子类中使用__construct的时候,至关于重载了父类的 __construct方法,故父类的构造函数不执行。 
因此在子类中要加载父类的构造函数。code

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错误。it

相关文章
相关标签/搜索