codeigniter中的get_instance():为什么要将其赋给变量?
在 Codeigniter 中,是一个全局可用的函数,它返回包含所有当前装入的类的 Controller 超级对象(它返回 Controller 类实例)。我将包括当前的源代码:get_instance()
get_instance()
定义于Codeigniter.php
// Load the base controller class
require BASEPATH.'core/Controller.php';
function &get_instance()
{
return CI_Controller::get_instance();
}
并定义于CI_Controller
Controller.php
class CI_Controller {
private static $instance;
/**
* Constructor
*/
public function __construct()
{
self::$instance =& $this;
// Assign all the class objects that were instantiated by the
// bootstrap file (CodeIgniter.php) to local class variables
// so that CI can run as one big super object.
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->set_base_classes()->ci_autoloader();
log_message('debug', "Controller Class Initialized");
}
public static function &get_instance()
{
return self::$instance;
}
}
以下是建议在创建库的用户指南中使用它的方法:
利用库中的 CodeIgniter 资源
要访问库中的 CodeIgniter 本机资源,请使用该函数。此函数返回 CodeIgniter 超级对象。
get_instance()
通常,从控制器函数中,您将使用构造:等调用任何可用的CodeIgniter函数。
$this
$this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url');
$this
但是,只能在控制器、模型或视图中直接工作。如果要在自己的自定义类中使用 CodeIgniter 的类,可以按如下方式操作:首先,将 CodeIgniter 对象分配给一个变量:
$CI =& get_instance();
将对象赋给变量后,您将使用该变量而不是: $CI =& get_instance();$CI->load->helper('url');$CI->load->library('session');$CI->config->item('base_url');等。
$this
注意:您会注意到上述函数是通过引用传递的:
get_instance()
$CI =& get_instance();
这一点非常重要。通过按引用赋值,您可以使用原始的 CodeIgniter 对象,而不是创建它的副本。
相关文章: explain $CI =& get_instance(); / Codeigniter: Get Instance
所以,这是我的实际问题:
为什么用户指南建议分配给变量?我很确定我理解不通过引用赋值的含义,但是为什么建议在工作正常时将其赋值给变量?get_instance()
get_instance()->load->model()
我在CI中看到许多用户定义的或第三方的类,它们分配给对象的属性:
class MY_Class {
private $CI;
function __construct()
{
$this->CI =& get_instance();
}
function my_func()
{
$this->CI->load->view('some_view');
}
function my_other_func()
{
$this->CI->load->model('some_model');
}
}
可怜的例子,但我经常看到这个。为什么要费心使用此方法,而不仅仅是直接调用?似乎将整个 Controller 对象分配给类变量并不是一个好主意,即使它是一个引用。也许这并不重要。get_instance()
我想为它编写一个包装器函数,这样它更容易键入,并且我不必经常将其分配给变量。get_instance()
function CI()
{
return get_instance();
}
艺术
function CI()
{
$CI =& get_instance();
return $CI;
}
然后,我可以从任何地方使用,而不必将其分配给变量,它很容易编写和理解它的作用,并且可以产生更短,更优雅的代码。CI()->class->method()
- 有什么理由不采取这种方法吗?
- 上述两个函数之间有什么区别吗?
CI()
- 为什么建议赋值变量而不是直接调用它?
get_instance()
- in 的定义是什么意思?我对引用的用途有所了解,并在适当的时候使用它们,但我从未见过以这种方式定义的函数。如果我确实编写了一个包装器函数,我是否也应该使用它?
&
function &get_instance(){}
请注意,这不是一个风格问题,而是一个技术问题。我想知道使用我建议的方法是否有任何问题,性能或其他方面。
编辑:到目前为止,我们有:
- 方法链接在 php4 中不可用,因此分配给变量是一种解决方法(尽管这相当无关紧要,因为 Codeigniter 已经放弃了对 php4 的支持)
- 多次调用函数以返回对象,而不是调用它一次并分配给变量的次要开销。
还有什么,或者这些是唯一的潜在问题?