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