wyjaśnij $ CI = & get_instance ();

86

Przeglądając kod źródłowy Codeigniter,

w jego funkcjach pomocniczych ciągle widzę kod, $CI =& get_instance(); czy ktoś może mi wyjaśnić, jak działa ten kod?

Rozumiem, że zwraca odwołanie do super obiektu $ CI, ale skąd get_instance()pochodzi?

Hailwood
źródło
Przeczytaj stackoverflow.com/a/63914758/2943403, aby zrozumieć, dlaczego nie powinieneś pisać =&nigdzie w swoim projekcie.
mickmackusa

Odpowiedzi:

73

Jest to w zasadzie pojedynczy wzorzec projektowy, który używa funkcji zamiast metody statycznej.

Aby przyjrzeć się głębiej, sprawdź kod źródłowy

Więc w zasadzie nie wymusza singletona, ale jest skrótem do funkcji publicznej ...

Edycja: Właściwie teraz rozumiem. Aby zapewnić kompatybilność z PHP4, musieli zrobić hackowanie podwójnej zmiennej globalnej , aby poprawnie zwróciło odwołania. W przeciwnym razie wszystkie referencje zostałyby schrzanione. A ponieważ PHP4 nie posiadało wsparcia dla metod statycznych (no cóż, właściwie tak), użycie tej funkcji było lepszym sposobem. Więc nadal istnieje ze starszych powodów ...

Więc jeśli twoja aplikacja jest tylko PHP5, nie powinno być nic złego w zrobieniu CI_Base::get_instance();zamiast tego, jest identyczna ...

ircmaxell
źródło
2
Kiedy używać super obiektu CI i dlaczego? Czy możesz wskazać mi jakąś dokumentację CI dotyczącą super obiektu CI?
Girish,
1
+1 za wskazanie użycia REPLACEMENT, ponieważ $CI =& get_instance();waliłem twarzą w Dokumenty, szukając tego ...
HomeOffice
@Bugfixer Gdy zobaczysz ten błąd 404, edytuj ten link za pomocą web.archive.org . Zrobiłem już dla tego linku
jestem najgłupszą osobą
20

get_instance () to funkcja zdefiniowana w podstawowych plikach CodeIgniter. Używasz go do pobierania pojedynczego odniesienia do super obiektu CodeIgniter, gdy jesteś w zasięgu poza super obiektem.

Jestem prawie pewien, że jest to zdefiniowane w base.php lub czymś podobnym.

Przebrnąć
źródło
6

Tylko klasa, która rozszerza CI_Controller, Model, View może używać

$this->load->library('something');
$this->load->helper('something');//..etc

Twoja klasa niestandardowa nie może używać powyższego kodu. Aby użyć powyższych funkcji w swojej klasie niestandardowej, musisz użyć

$CI=&get instance();
$CI->load->library('something');
$CI->load->helper('something');

na przykład w swojej klasie niestandardowej

// 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
źródło
4

jest to pojedyncza struktura, aby zrozumieć, w jaki sposób Codeigniter ładuje biblioteki i klasy

<?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
źródło
1

$ CI = get_instance (); polega na zamianie $ this na $ CI na helper,

Tofan
źródło
ale musisz zdefiniować swojego pomocnika na automatycznym ładowaniu [biblioteka]
Tofan