首页 > 心情随笔 > 【ThinkPHP】__construct()和_initialize()的比较

【ThinkPHP】__construct()和_initialize()的比较

2015年6月27日 发表评论 阅读评论

先上一段框架里的代码,位于Controller.class.php里

 /**
* 架构函数 取得模板对象实例
* @access public
*/
public function __construct() {
Hook::listen('action_begin',$this->config);
//实例化视图类
$this->view = Think::instance('Think\View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();
}

看过代码就比较明白了,_initialize只是个钩子方法,不是系统函数。其他的原因一段网友评论,说的比较到位了。

TP中出现_initialize()这一方法的原因我觉得应该是 为了防止在子类中重写构造方法时,忘记调用父类的构造方法,从而使 tag('action_begin',$this->config);这段代码不执行。
真要牵强的说是为了避免频繁的使用parent::__construct(),我只能对你说:在后面de继承链上写的_initialize()一样要使用parent::_initialize() 来调用往上的_initialize()方法,这样来书的话它又节约了什么?
不管__construct()也好,还是TP的_initialize(),都是要遵守类继承中的方法重载的规则。从这一点出发,才能正确的领会这两个方法在使用中需要注意的是什么。
归结到一点:类继承中的方法重载的规则 和 if(method_exists($this,'_initialize'))
$this->_initialize();钩子。
其他的, 我没见着有多神奇。

结论:建议采用在_initialize()方法中来做Controller的初始化,从而避免在子类中忘了调用parent::__construct()而导致系统的一些功能不执行。当然子类为确保父类的_initialize方法被执行,依旧需要parent::_initialize()来调用。


枫芸志原创文章,转载请注明来源并保留原文链接




本文链接:http://witmax.cn/thinkphp-construct-vs-initialize.html




分类: 心情随笔 标签: 2,600次阅读
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。

无觅相关文章插件,快速提升流量