关闭

thinkphp中__initialize和__construct的区别

标签: thinkphp
432人阅读 评论(0) 收藏 举报
分类:

          __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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:66855次
    • 积分:1050
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:82篇
    • 译文:0篇
    • 评论:2条
    最新评论