thinkphp 文件里面既有__initialize()又有__construct(),是否一起起作用呢?

thinkphp 文件里面既有__initialize()又有__construct(),是否一起起作用呢?

class Controller{
    public function _initialize(){
    }
    
    public function _construct(){
    }

}
阅读 3k
2 个回答

__construct()是类的构造函数,_initialize()只是thinkphp定义的一个特殊的方法而已。
正常情况下子类继承父类,子类初始化且同时要调用父类的初始化的写法是这样的

class A 
{
    public function __construct()
    {
        //todo
    }
}

class B extends A 
{
    public function __construct()
    {
         parent::__construct(); 
    }    
}

但是thinkphp呢,觉得频繁调用parent::__construct太麻烦了,所以他在基类的时候做了这样一件事。

clipboard.png
这方法就是父类调用子类的方法_initialize()在父类里初始化,子类没有构造函数,所以直接继承父类的构造函数,达到初始化的效果。

好吧,废化说了一大堆现在回答你的问题吧。
“thinkphp 文件里面既有__initialize()又有__construct(),是否一起起作用呢?”
嗯,这个问题好纠结,不知道怎么回答,怕回答不全,因为赶脚分好多情况啊,我就说比较普遍的情况吧。

作死型

class AController extends Controller {
    public function _initialize(){
    }
    
    public function __construct(){
       /**
        * 如果子类不写parent::__construct()的话,那当然就不会一起作用啦。
        * 但为什么又说是作死呢,因为如果不继承父类的构造函数,很多功能就用不了啦
        * 不做死就不会死
        */  
    }

}

比较正常型

class AController extends Controller {
    public function _initialize(){
    }
    
    public function __construct(){
       parent::__construct();
       /**
        * 如果两个_initialize()和__construct()里面的代码功能不重复的话,
        * 还有我脑子没瓦特的话,应该是一起起作用的
        */
    }

}

题外话,既然都使用tp框架了,就按照人家订的规则来写就好啦,子类初始化的时候直接使用_initialize()就好了,为什么非要那么叛逆用__construct()呢?听话做个乖孩子不好嘛

  if(method_exists($this,'_initialize'))
            $this->_initialize();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进