【ThinkPHP】__construct()和_initialize()的比较
先上一段框架里的代码,位于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()来调用。
标签: PHP
还没有人抢沙发呢~