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?
php
codeigniter
Hailwood
la source
la source
=&
nulle part dans votre projet.Réponses:
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 ...la source
$CI =& get_instance();
je me cognais le visage sur les documents à la recherche de cela ...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.
la source
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.
la source
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();
la source
$ CI = get_instance (); est de remplacer $ this par $ CI sur helper,
la source