web-dev-qa-db-fra.com

expliquer $ CI = & get_instance ();

En parcourant le code source de codeigniter,

je continue à voir le code dans ses fonctions d'assistance $CI =& get_instance(); quelqu'un peut-il m'expliquer s'il vous plaît comment fonctionne ce code?

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

84
Hailwood

Il s’agit d’un Singleton Design Pattern qui utilise une fonction au lieu d’une méthode statique.

Pour regarder plus en profondeur, consultez le code source

Donc, fondamentalement, il 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 devaient faire un = double-global-variable-hack pour qu'il renvoie correctement les références. Sinon, les références seraient tout gâchées. Et comme PHP4 ne supportait pas les méthodes statiques (enfin, correctement quand même), utiliser la fonction était la meilleure solution. Donc, il existe toujours pour des raisons d'héritage ...

Donc si votre application est uniquement en PHP5, il devrait rien à redire à faire CI_Base::get_instance(); à la place, c’est identique ...

72
ircmaxell

get_instance () est une fonction définie dans les fichiers core 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 sûr que c'est défini dans base.php ou quelque chose de similaire.

19
Wade

c'est une structure singleton pour comprendre comment le codeigniter charge les librairies 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();
3
souparno majumder

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

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

1
Tofan