In Codeigniter, get_instance()
is a globally available function that returns the Controller super-object which contains all the currently loaded classes (it returns the Controller class instance). I'll include the current source code:
get_instance()
is defined in Codeigniter.php
// Load the base controller class require BASEPATH.'core/Controller.php'; function &get_instance() { return CI_Controller::get_instance(); }
And CI_Controller
is defined in 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; } }
Here's how it is recommended to be used in the 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.
Related posts: explain $CI =& get_instance(); / Codeigniter: Get Instance
So, here is my actual question:
Why does the user guide recommend assigning get_instance()
to a variable? I'm fairly certain I understand the implications of not assigning by reference, but why is it recommended to assign it to a variable when get_instance()->load->model()
works fine?
I see a lot of user defined or third party classes in CI that assign to a property of the object:
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'); } }
Poor example, but I see this frequently. Why bother with this method instead of just calling get_instance()
directly? It seems like assigning the entire Controller object to a class variable wouldn't be a great idea, even if it is a reference. Maybe it doesn't matter.
I want to write a wrapper function for get_instance()
so it's easier to type, and I don't have to constantly assign it to a variable.
function CI() { return get_instance(); }
Or:
function CI() { $CI =& get_instance(); return $CI; }
Then I could use CI()->class->method()
from anywhere without the hassle of assigning it to a variable, it's very easy to write and understand what it does, and can result in shorter, more elegant code.
CI()
functions above?get_instance()
to a variable rather than calling it directly?&
in function &get_instance(){}
mean where it is defined? I know a bit about what references are for and I use them when appropriate, but I've never seen a function defined this way. If I do write a wrapper function, should I use this as well?Please note that this is not so much a style question, but a technical one. I want to know if there are any issues, performance or otherwise, with using the method I'm suggesting.
EDIT: So far we have:
Anything else, or are these the only potential issues?
get_instance() is a function defined in the core files of CodeIgniter. You use it to get the singleton reference to the CodeIgniter super object when you are in a scope outside of the super object.
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.
In terms of codeigniter: You'll notice that each controller in codeigniter extends the base controller class. Using $this in a controller gives you access to everything which is defined in your controller, as well as what's inherited from the base controller.
Constructor is a function that is automatically called when instantiated. this function helps us to intialize the things that we are going to need frequently in our code like when we have to load the models of helpers like form e.t.c.
As far as I know, it's a matter of convenience more than anything. Chances are that you will be using the CI super object a lot in your libraries so why not assign it to a variable to make it a little easier to work with?
There are a few other things to consider...
get_instance()
every time you use the helper rather than storing its result in a variable.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With