gpt4 book ai didi

php - Codeigniter : Why assign it to a variable? 中的 get_instance()

转载 作者:IT老高 更新时间:2023-10-28 12:05:37 27 4
gpt4 key购买 nike

在 Codeigniter 中,get_instance()是一个全局可用的函数,它返回包含所有当前加载的类的 Controller 超对象(它返回 Controller 类实例)。我将包含当前的源代码:

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;
}
}

以下是 user guide for creating libraries 中的推荐使用方式:

Utilizing CodeIgniter Resources within Your Library

To access CodeIgniter's native resources within your library use the get_instance() function. This function returns the CodeIgniter super object.

Normally from within your controller functions you will call any of the available CodeIgniter functions using the $this construct: $this->load->helper('url'); $this->load->library('session');
$this->config->item('base_url');
etc.

$this, however, only works directly within your controllers, your models, or your views. If you would like to use CodeIgniter's classes from within your own custom classes you can do so as follows:

First, assign the CodeIgniter object to a variable:

$CI =& get_instance();

Once you've assigned the object to a variable, you'll use that variable instead of $this: $CI =& get_instance(); $CI->load->helper('url'); $CI->load->library('session'); $CI->config->item('base_url'); etc.

Note: You'll notice that the above get_instance() function is being passed by reference:

$CI =& get_instance();

This is very important. Assigning by reference allows you to use the original CodeIgniter object rather than creating a copy of it.

相关帖子: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');
}
}

糟糕的例子,但我经常看到这种情况。为什么要使用这种方法而不是仅仅调用 get_instance()直接地? 似乎将整个 Controller 对象分配给一个类变量并不是一个好主意,即使它是一个引用。也许没关系。

我想为 get_instance() 写一个包装函数所以打字更容易,我不必经常将它分配给变量。

function CI()
{
return get_instance();
}

或者:

function CI()
{
$CI =& get_instance();
return $CI;
}

然后我可以使用 CI()->class->method()从任何地方无需将其分配给变量的麻烦,编写和理解它的作用非常容易,并且可以产生更短、更优雅的代码。

  • 有什么理由不采用这种方法吗?
  • 这两者有什么区别CI()上面的函数?
  • 为什么建议分配get_instance()到一个变量而不是直接调用它?
  • & 是什么意思?在 function &get_instance(){}意思是在哪里定义的?我知道一些references是 for 并且我在适当的时候使用它们,但我从未见过以这种方式定义的函数。如果我确实编写了一个包装函数,我是否也应该使用它?

请注意,这不是一个风格问题,而是一个技术问题。我想知道使用我建议的方法是否有任何问题,性能或其他

编辑:到目前为止,我们有:

  • 方法链在 php4 中不可用,因此分配给变量是一种解决方法(尽管这与 Codeigniter 已放弃 php4 支持无关)
  • 多次调用函数以返回对象而不是调用一次并分配给变量的开销很小。

还有其他问题吗,或者这些是唯一的潜在问题吗?

最佳答案

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

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

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

关于php - Codeigniter : Why assign it to a variable? 中的 get_instance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195544/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com