explique $ CI = & get_instance ();

86

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?

Granizo
fuente
Lea stackoverflow.com/a/63914758/2943403 para comprender por qué no debe escribir =&en ninguna parte de su proyecto.
mickmackusa

Respuestas:

73

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 ...

ircmaxell
fuente
2
¿Cuándo usar el superobjeto de CI y por qué? ¿Puede indicarme alguna documentación de CI sobre el superobjeto de CI?
Girish
1
+1 por señalar realmente el uso de REEMPLAZO porque $CI =& get_instance();me estaba golpeando la cara con los Documentos en busca de eso ...
HomeOffice
@Bugfixer Cuando vea ese error 404, edite ese enlace usando web.archive.org . Ya hecho para ese enlace
Soy la persona más estúpida
20

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.

Vadear
fuente
6

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.
Khant Wai Kyaw
fuente
4

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();
souparno majumder
fuente
1

$ CI = get_instance (); es reemplazar $ this por $ CI en helper,

Tofan
fuente
pero debes definir tu ayudante en autoload [biblioteca]
Tofan