- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 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_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;
}
}
以下是 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');
etc.
$this->config->item('base_url');
$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 并且我在适当的时候使用它们,但我从未见过以这种方式定义的函数。如果我确实编写了一个包装函数,我是否也应该使用它?请注意,这不是一个风格问题,而是一个技术问题。我想知道使用我建议的方法是否有任何问题,性能或其他。
编辑:到目前为止,我们有:
还有其他问题吗,或者这些是唯一的潜在问题吗?
最佳答案
据我所知,这比什么都方便。您可能会在您的库中大量使用 CI super 对象,那么为什么不将它分配给一个变量以使其更易于使用呢?
还有一些其他的事情需要考虑...
get_instance()
,而不是将其结果存储在变量中。关于php - Codeigniter : Why assign it to a variable? 中的 get_instance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195544/
在典型的单例中,构造函数在第一次调用 getInstance() 时被调用。我需要的是将 init 和 getInstance 函数分开。 init 函数必须创建实例 using constructo
浏览codeigniter的源码, 在它的辅助函数中,我不断看到代码$CI =& get_instance();谁能给我解释一下这段代码是如何工作的? 我知道它正在返回对 $CI super 对象的引
在 PHPStorm 中,通过向 config/autocomplete.php 添加一个包含属性的文件,我已经能够使用 Codeigniter 获得自动完成功能。 PhpStorm 能够读取此文件,
我发现这个有用的国际化代码: http://pastebin.com/SyKmPYTX 一切正常,除了我无法在此类中使用 CI 函数。 我想从 DB 设置 $languages 和 $special
这是我在 codeigniter 库文件夹中的自定义类 class Commonlib { public function __construct() {
我有一些功能可以管理 Controller 文件中某个 Controller 的访问级别。 我决定带他们去图书馆或 helper 。 由于它们主要是程序性的,我决定使用助手。 这是 Controlle
在 Codeigniter 中,get_instance()是一个全局可用的函数,它返回包含所有当前加载的类的 Controller 超对象(它返回 Controller 类实例)。我将包含当前的源代
我在/application/core 中有一个 Controller /application/core/CMS_Controller.php load->view('view'); } }
我的 codeigniter 网站在 php5.4 版本中运行正常,但是当我将我的 php 版本升级到 php5.6.30 时,它无法正常工作。 function &get_instance() {
我目前正在使用 Eclipse PDT 和 CodeIgniter,是否可以像这样获得 session 库的代码完成: $CI = &get_instance(); $CI->session->se
在下面的这个虚拟示例中,我想创建一个单例,我可以在其中保存在嵌入式微 Controller 上成本很高的 get_instance 调用。 #include template class Camel
我的 WordPress 网站出现 fatal error ,详情如下: Fatal error: Uncaught Error: Call to undefined method WP_Site_H
我是一名优秀的程序员,十分优秀!