thinkphp中__initialize和__construct的区别

          __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();
    }
        你会发现因为走了子类的构造方法因而无法走父类构造方法,因而无法加载视图。另外,代码最后两句, 走了子类中的__initialize方法。故, __initialize方法的存在是为了避免在子类中频繁调用父类__construct方法,用__initialize方法就能自动调用,在子类中也能自动走__initialize方法     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值