Mirando a través del código fuente de codeigniter,
en sus funciones de ayuda sigo viendo código,
$CI =& get_instance();
¿alguien puede explicarme cómo funciona este código?
Entiendo que está devolviendo una referencia al superobjeto $ CI, pero ¿de dónde get_instance()
viene?
php
codeigniter
Granizo
fuente
fuente
=&
en ninguna parte de su proyecto.Respuestas:
Es básicamente un patrón de diseño Singleton que usa una función en lugar de un método estático.
Para profundizar, consulte el código fuente
Entonces, básicamente, no aplica el singleton, pero es un atajo a una función pública ...
Editar: De hecho, ahora lo entiendo. Para la compatibilidad con PHP4, tuvieron que hacer un truco doble de variable global para que devolviera las referencias correctamente. De lo contrario, las referencias se estropearían. Y dado que PHP4 no tenía soporte para métodos estáticos (bueno, correctamente 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 malo en hacer en su
CI_Base::get_instance();
lugar, es idéntica ...fuente
$CI =& get_instance();
me estaba golpeando la cara con los Documentos en busca de eso ...get_instance () es una función definida en los archivos principales de CodeIgniter. Lo usa para obtener la referencia singleton al superobjeto CodeIgniter cuando se encuentra en un alcance fuera del superobjeto.
Estoy bastante seguro de que está definido en base.php o algo similar.
fuente
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 utilizar el código anterior. Para utilizar las funciones anteriores en su clase personalizada, debe utilizar
$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.
fuente
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();
fuente
$ CI = get_instance (); es reemplazar $ this por $ CI en helper,
fuente