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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值