codeigniter中的get_instance():为什么要将其赋给变量?

2022-08-30 09:41:13

在 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_ControllerController.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 的支持)
  • 多次调用函数以返回对象,而不是调用它一次并分配给变量的次要开销。

还有什么,或者这些是唯一的潜在问题?


答案 1

据我所知,这比什么都方便。您可能会在库中大量使用CI超级对象,那么为什么不将其分配给变量以使其更易于使用呢?

还有其他一些事情需要考虑...

  1. 如果将此方法放在帮助程序中,则该方法将成为使用它的任何类的依赖项。这对你来说可能没什么大不了的,但是如果你想与其他人共享库,他们可能对依赖关系不满意,特别是因为CI社区中已经有一种标准的方式来处理这个问题。
  2. 对性能有轻微的影响,因为每次使用帮助程序时都会调用,而不是将其结果存储在变量中。get_instance()
  3. 由于这是一种应该节省您时间的帮助器方法,因此对于主要在CI的核心MVC文件中工作的任何人来说,设置这样的帮助程序将花费更长的时间,而不仅仅是在您需要的少数几个地方将其设置为变量。

答案 2

为什么建议将get_instance()赋给变量,而不是直接调用它?

最有可能的是,建议保持与php4的向后兼容性,默认情况下,对象不是通过引用传递的,而是克隆的。

有什么理由不采取这种方法吗?

仅当您希望应用程序在过时的php安装上运行时


推荐