如何摆脱Codeigniter中的& get_instance()

时间:2013-07-18 09:25:11

标签: php codeigniter laravel instance autoload

我已经使用CI两年了。让我烦恼的一件事是使用&get_instance()。虽然我们在图书馆,帮助者,演示者,模特等内部是有点可怜的但是每次加载它都是笨拙的。如果您忘记将其加载到某个位置而只是使用$this->blah->blah()而不是$CI->blah->blah()这会造成太多麻烦,如果您在线工作,则会遇到抱怨他看到错误的客户。我在laravel中看到,您不需要在整个应用程序中的任何位置加载instance。这是因为laravelautoloading所有库和模型,并且两者都可以在应用程序的任何位置使用。但在我看来,为什么加载某些特定地方不需要的类是不利的。这告诉我Codeigniter是灵活的,但我仍然想要一个替代方案,我不想使用&get_instance()。有什么想法或建议吗?请。

1 个答案:

答案 0 :(得分:1)

在您的模型或核心模型或库中

//class MY_Model extends CI_Model 
//class SomeLibrary

class Some_model extends CI_Model {  

        private $_CI;

        public function __construct() {
            parent::__construct(); //for model or core model

            $this->_CI =& get_instance();
        }   

        //if you called attributs who does not exist in that class or parent class
        public function __get($key)
        {
            return $this->_CI->$key;
        }

        //if you called methods who does not exist in that class or parent class
        public function __call($method, $arguments)
        {
            call_user_func_array(array($this->_CI, $method), $arguments );
        }

        public function test() {
            var_dump($this->some_controller_key);
            var_dump($this->some_lib_loaded);
        }
}

*未经测试

受到来自令人敬畏的 Flexi Auth

的一段代码的启发
    //from a Model to keep access of CI_Controller attributs
    public function &__get($key)
    {
        $CI =& get_instance();
        return $CI->$key;
    }

当我看到^^

时,我感到很震惊

为了解释&__get,我想当你第二次调用这个神奇的方法时,PHP将不会再次执行它,但会从第一次调用中获取结果。