1

我已经使用 CI 两年了。真正让我烦恼的一件事是使用&get_instance(). 虽然当我们在 library 、 helper 、 Presenters 、 model 等中时它是 halpful。但每次加载它都很麻烦。如果您忘记将其加载到某个地方并简单地使用它$this->blah->blah()来代替$CI->blah->blah()这会带来太多麻烦,并且如果您在网上工作,您会遇到抱怨他看到错误的客户。我已经看到laravel您不需要instance在整个应用程序中加载任何地方。这是因为laravelautoloading所有的库和模型都可以在应用程序的任何地方使用。但这在我看来是不利的,为什么加载某些特定地方不需要的类。这告诉我 Codeigniter 很灵活,但我仍然想要一个我不想使用的替代方案&get_instance()。有什么想法或建议吗?请。

4

1 回答 1

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 不会再次执行它,而是会从第一次调用中获取他的结果。

于 2013-07-18T10:17:24.640 回答