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方法     

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a595364628/article/details/49943999
文章标签: thinkphp
个人分类: thinkphp
上一篇thinkphp命名空间
下一篇社会生活十大著名法则
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭