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