2013-07-18 24 views
1

我已经使用CI两年了。有一件事情让我非常恼火,那就是使用&get_instance()。尽管我们在图书馆,助手,主持人,模特等人员内部时感到不安。但每次加载时都很笨拙。如果您忘记将它加载到某个地方,只需使用$this->blah->blah()而不是$CI->blah->blah(),这会造成太多麻烦,如果您在线工作,则会面临抱怨他发现错误的客户端。我在laravel中看到,您无需在整个应用程序的任何地方加载instance。这是因为laravelautoloading所有库和模型都可以在应用程序的任何地方使用。但是在我看来,这不利于加载某些特定位置不需要的类。这告诉我Codeigniter是灵活的,但我仍然想要一个替代方案,我不想使用&get_instance()。任何想法或建议?请。如何摆脱Codeigniter中的&get_instance()

+0

自动加载不应该表示它加载所有类,但在需要时加载它们。但是接下来我又怎么知道CodeIgniter呢? – Rufinus

+0

没有其他选择,您需要这样做才能获得实际的原始CI模型。如果您犯了一个错误并使用$ this,只需使用内置于文本编辑器中的替换函数即可。 –

回答

0

在你的模型或核心模型或库

//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验证

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

我很震惊当我看到^^

To e xplain &__get,我认为当你第二次调用这个神奇的方法时,PHP将不会再执行它,但会从第一次调用中获得他的结果。

+0

感谢您的回复。我一定会测试它 –