php - get_instance - get instance codeigniter
explicar $ CI=& get_instance(); (5)
Básicamente es un patrón de diseño Singleton que utiliza una función en lugar de un método estático.
Para ver más profundo, revisa el código fuente
Básicamente, no aplica el singleton, pero es un acceso directo a una función pública ...
Editar: En realidad, ahora lo entiendo. Para la compatibilidad de PHP4 tenían que hacer un double-global-variable-hack para que devolviera las referencias correctamente. De lo contrario, las referencias se estropearían. Y como PHP4 no tenía soporte para métodos estáticos (bueno, de todos modos), usar la función era la mejor manera. Entonces todavía existe por razones heredadas ...
Entonces, si su aplicación es solo PHP5, no debería haber nada de malo en hacer CI_Base::get_instance();
en cambio, es idéntico ...
Mirando a través del código fuente de codeigniter,
en sus funciones auxiliares sigo viendo el código $CI =& get_instance();
¿alguien puede por favor explicarme cómo funciona este código?
Entiendo que está devolviendo una referencia al súper objeto $ CI, pero ¿de dónde get_instance()
?
En algunos casos, es posible que desee desarrollar clases que existan aparte de sus controladores, pero que tengan la capacidad de utilizar todos los recursos de Code Igniter. Esto es fácilmente posible mediante el uso de funciones get_instance () .
Cualquier clase que instancia en las funciones de su controlador puede acceder a los recursos nativos de Code Igniter simplemente usando la función get_instance (). Esta función devuelve el objeto Code Igniter principal.
Normalmente, para llamar a cualquiera de las funciones disponibles de Code Igniter, debe usar $ this :
$this->load->helper(''url'');
$this->load->library(''session'');
$this->config->item(''base_url'');
etc.
$ esto , sin embargo, solo funciona dentro de sus controladores, sus modelos o sus puntos de vista. Si desea utilizar las clases de Code Igniter desde sus propias clases personalizadas, puede hacerlo de la siguiente manera:
Primero, asigne el objeto Code Igniter a una variable:
$obj =& get_instance();
Una vez que haya asignado el objeto a una variable, usará esa variable en lugar de $ this :
$obj =& get_instance();
$obj->load->helper(''url'');
$obj->load->library(''session'');
$obj->config->item(''base_url'');
etc.
Nota: Notará que la función get_instance () anterior se pasa por referencia:
$obj =& get_instance();
Esto es muy importante. Asignar por referencia le permite usar el objeto Code Igniter original en lugar de crear una copia del mismo.
Puede leer sobre esta función desde here
Solo la clase que extiende CI_Controller, Model, View puede usar
$this->load->library(''something'');
$this->load->helper(''something'');//..etc
Su clase personalizada no puede usar el código anterior. Para usar las funciones anteriores en su clase personalizada, debe usar
$CI=&get instance();
$CI->load->library(''something'');
$CI->load->helper(''something'');
por ejemplo, en tu clase personalizada
// this following code will not work
Class Car
{
$this->load->library(''something'');
$this->load->helper(''something'');
}
//this will work
Class Car
{
$CI=&get_instance();
$CI->load->library(''something'');
$CI->load->helper(''something'');
}
// Here $CI is a variable.
esta es una estructura singleton para entender cómo el codeigniter carga las bibliotecas y clases
<?php
/*
====================================
start of the loader class
====================================
*/
class Loader {
protected function _init_class($class){
$C = Controller::get_instance();
$name = strtolower($class);
$C->$name = new $class();
}
public function _class($library){
if(is_array($library)){
foreach($library as $class){
$this->library($class);
}
return;
}
if($library == ''''){
return false;
}
$this->_init_class($library);
}
public function view ($param) {
echo $param;
}
}
/*
===============================
End of the loader class
==============================
*/
/*
===============================
start of core controller class
==============================
*/
class Controller {
private static $instance;
function __construct () {
self::$instance = $this;
$this->load = new Loader();
}
public static function get_instance(){
return self::$instance;
}
}
/*
===============================
end of the core controller class
===================================
*/
/*
====================================================
start of library sections (put all your library classes in this section)
=====================================================
*/
class MyLibrary {
private $c;
function __construct() {
$this->c = Controller::get_instance();
}
function say($sentence) {
$this->c->load->view($sentence);
}
}
/*
====================================================
End of the library sections
====================================================
*/
/*
============================================
start of controller section (put all your controller classes in this section)
===========================================
*/
class Foo extends Controller {
function __construct () {
parent::__construct();
$this->load->_class(''MyLibrary'');
}
function bar() {
$this->mylibrary->say(''Hello World'');
}
}
/*
==========================================
End of the controller sections
==========================================
*/
$foo = new Foo();
$foo->bar();
get_instance () es una función definida en los archivos centrales de CodeIgniter. Lo usa para obtener la referencia singleton del superobjeto CodeIgniter cuando se encuentra en un ámbito fuera del súper objeto.
Estoy bastante seguro de que está definido en base.php o algo similar.