【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()来调用。



    本博客所有文章如无特别注明均为原创。
    复制或转载请以超链接形式注明转自枫芸志,原文地址《【ThinkPHP】__construct()和_initialize()的比较
    标签:
    分享:

还没有人抢沙发呢~

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