expliquer $ CI = & get_instance ();

86

En parcourant le code source de codeigniter,

dans ses fonctions d'aide, je continue de voir du code $CI =& get_instance(); est-ce que quelqu'un peut-il m'expliquer comment ce code fonctionne?

Je comprends qu'il renvoie une référence au super objet $ CI, mais d'où get_instance()vient-il?

Hailwood
la source
Veuillez lire stackoverflow.com/a/63914758/2943403 pour comprendre pourquoi vous ne devriez écrire =&nulle part dans votre projet.
mickmackusa le

Réponses:

73

Il s'agit essentiellement d'un modèle de conception Singleton qui utilise une fonction au lieu d'une méthode statique.

Pour approfondir, consultez le code source

Donc, fondamentalement, cela n'applique pas le singleton, mais c'est un raccourci vers une fonction publique ...

Edit: En fait, maintenant je comprends. Pour la compatibilité PHP4, ils ont dû faire un double-global-variable-hack pour lui faire renvoyer correctement les références. Sinon, les références seraient toutes foutues. Et comme PHP4 ne supportait pas les méthodes statiques (enfin, correctement en tout cas), utiliser la fonction était la meilleure façon. Donc, il existe toujours pour des raisons d'héritage ...

Donc, si votre application est uniquement PHP5, il ne devrait y avoir rien de mal à faire à la CI_Base::get_instance();place, c'est identique ...

ircmaxell
la source
2
Quand utiliser le super objet CI et pourquoi? Pouvez-vous m'indiquer une documentation CI concernant le super objet CI?
Girish
1
+1 pour avoir pointé vers l' utilisation de REMPLACEMENT car $CI =& get_instance();je me cognais le visage sur les documents à la recherche de cela ...
HomeOffice
@Bugfixer Lorsque vous voyez cette erreur 404, veuillez modifier ce lien en utilisant web.archive.org . Déjà fait pour ce lien
Je suis la personne la plus stupide
20

get_instance () est une fonction définie dans les fichiers de base de CodeIgniter. Vous l'utilisez pour obtenir la référence singleton au super objet CodeIgniter lorsque vous vous trouvez dans une étendue en dehors du super objet.

Je suis presque sûr qu'il est défini dans base.php ou quelque chose de similaire.

Patauger
la source
6

Seule la classe qui étend CI_Controller, Model, View peut utiliser

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

Votre classe personnalisée ne peut pas utiliser le code ci-dessus. Pour utiliser les fonctionnalités ci-dessus dans votre classe personnalisée, vous devez utiliser

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

par exemple, dans votre classe personnalisée

// 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
la source
4

c'est une structure singleton pour comprendre comment le codeigniter charge les bibliothèques et les classes

<?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
la source
1

$ CI = get_instance (); est de remplacer $ this par $ CI sur helper,

Tofan
la source
mais vous devez définir votre assistant sur le chargement automatique [bibliothèque]
Tofan