89 votes

expliquer $CI =& get_instance() ;

En regardant le code source de Codeigniter,

dans ses fonctions d'aide, je vois toujours le code $CI =& get_instance(); Quelqu'un peut-il m'expliquer comment fonctionne ce code ?

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

0 votes

Veuillez lire stackoverflow.com/a/63914758/2943403 pour comprendre pourquoi il ne faut pas écrire =& n'importe où dans votre projet.

75voto

ircmaxell Points 74865

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

Pour aller plus loin, consultez le site code source

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

Editer : En fait, je comprends maintenant. Pour la compatibilité avec PHP4, ils ont dû faire un double-variable-globale-hack pour qu'il renvoie les références correctement. Sinon, les références seraient complètement chamboulées. Et comme PHP4 n'avait pas de support pour les méthodes statiques (enfin, correctement en tout cas), utiliser la fonction était la meilleure solution. Elle existe donc toujours pour des raisons héritées du passé...

Ainsi, si votre application n'utilise que PHP5, il y a devrait Il n'y a rien de mal à faire CI_Base::get_instance(); Au lieu de cela, il est identique...

2 votes

Quand utiliser le super objet CI et pourquoi ? Pouvez-vous m'indiquer une documentation CI concernant le super objet CI ?

1 votes

+1 pour avoir pointé vers le REMPLACEMENT utilisation pour $CI =& get_instance(); J'étais en train de me taper la tête sur les docs pour trouver ça...

0 votes

@Bugfixer Lorsque vous voyez cette erreur 404, veuillez éditer ce lien en utilisant web.archive.org . Déjà fait pour ce lien

20voto

Wade Points 557

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 portée en dehors du super-objet.

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

12voto

Rafiq Points 142

Dans certains cas, vous pouvez vouloir développer des classes qui existent indépendamment de vos contrôleurs mais qui ont la capacité d'utiliser toutes les ressources de Code Igniter. Ceci est facilement réalisable en utilisant get_instance() fonctions.

Toute classe que vous instanciez dans les fonctions de votre contrôleur peut accéder aux ressources natives de Code Igniter en utilisant simplement la fonction get_instance(). Cette fonction renvoie l'objet principal de Code Igniter.

Normalement, pour appeler l'une des fonctions disponibles de Code Igniter, vous devez utiliser la fonction

$this</b> construct:

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');

etc.

$this ne fonctionne cependant qu'à l'intérieur de vos contrôleurs, de vos modèles ou de vos vues. Si vous souhaitez utiliser les classes de Code Igniter à l'intérieur de vos propres classes personnalisées, vous pouvez procéder comme suit :

Tout d'abord, assignez l'objet Code Igniter à une variable :

$obj =& get_instance();

Une fois que vous avez assigné l'objet à une variable, vous utiliserez cette variable à la place de $this :

$obj =& get_instance();
$obj->load->helper('url');
$obj->load->library('session');
$obj->config->item('base_url');

etc.

Note : Vous remarquerez que le texte ci-dessus get_instance() est passée par référence :

$obj =& get_instance();

C'est très important. L'affectation par référence vous permet d'utiliser l'objet Code Igniter d'origine plutôt que d'en créer une copie.

Pour en savoir plus sur cette fonction, consultez le site aquí

9voto

Khant Wai Kyaw Points 103

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.

4voto

souparno majumder Points 821

Il s'agit d'une structure singleton qui permet de comprendre comment 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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X