erkläre $ CI = & get_instance ();

85

Durchsuchen des Quellcodes des Codeigniters,

in seiner Hilfsfunktionen Ich sehe immer wieder Code $CI =& get_instance(); kann jemand mir bitte erklären , wie dieser Code funktioniert?

Ich verstehe, dass es einen Verweis auf das $ CI-Superobjekt zurückgibt, aber woher kommt get_instance()es?

Hagelholz
quelle

Antworten:

73

Es ist im Grunde ein Singleton-Entwurfsmuster , das eine Funktion anstelle einer statischen Methode verwendet.

Um genauer hinzuschauen, lesen Sie den Quellcode

Im Grunde erzwingt es den Singleton nicht, aber es ist eine Verknüpfung zu einer öffentlichen Funktion ...

Edit: Eigentlich verstehe ich jetzt. Aus Gründen der PHP4-Kompatibilität mussten sie einen Double-Global-Variable-Hack durchführen , damit die Referenzen ordnungsgemäß zurückgegeben wurden. Andernfalls würden die Referenzen alle vermasselt. Und da PHP4 keine Unterstützung für statische Methoden hatte (na ja, sowieso richtig), war die Verwendung der Funktion der bessere Weg. Es existiert also immer noch aus alten Gründen ...

Wenn Ihre App also nur PHP5 ist, sollte nichts falsch daran sein, CI_Base::get_instance();stattdessen ist sie identisch ...

ircmaxell
quelle
2
Wann und warum CI Super Object verwenden? Können Sie mich auf eine CI-Dokumentation zum CI-Superobjekt verweisen?
Girish
1
+1 für den tatsächlichen Hinweis auf die Verwendung von REPLACEMENT, denn $CI =& get_instance();ich habe mein Gesicht auf die Docs geschlagen, um danach zu suchen ...
HomeOffice
@Bugfixer Wenn Sie diesen 404-Fehler sehen, bearbeiten Sie diesen Link bitte mit web.archive.org . Bereits für diesen Link gemacht
Ich bin die dümmste Person
20

get_instance () ist eine Funktion, die in den Kerndateien von CodeIgniter definiert ist. Sie verwenden es, um die Singleton-Referenz auf das CodeIgniter-Superobjekt abzurufen, wenn Sie sich in einem Bereich außerhalb des Superobjekts befinden.

Ich bin mir ziemlich sicher, dass es in base.php oder ähnlichem definiert ist.

Waten
quelle
5

Nur die Klasse, die CI_Controller, Model, View erweitert, kann verwendet werden

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

Ihre benutzerdefinierte Klasse kann den obigen Code nicht verwenden. Um die oben genannten Funktionen in Ihrer benutzerdefinierten Klasse zu verwenden, müssen Sie sie verwenden

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

Zum Beispiel in Ihrer benutzerdefinierten Klasse

// 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
quelle
3

Dies ist eine Singleton-Struktur, um zu verstehen, wie der Codeigniter die Bibliotheken und Klassen lädt

<?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
quelle
1

$ CI = get_instance (); ist es, $ this durch $ CI im Helfer zu ersetzen,

Tofan
quelle
aber Sie müssen Ihren Helfer auf Autoload [Bibliothek] definieren
Tofan