Olhando através do código-fonte do codeigniter,
em suas funções auxiliares, continuo vendo código,
$CI =& get_instance();
alguém pode me explicar como esse código funciona?
Eu entendo que ele está retornando uma referência ao superobjeto $ CI, mas de onde get_instance()
vem?
php
codeigniter
Hailwood
fonte
fonte
=&
em nenhum lugar do seu projeto.Respostas:
É basicamente um Singleton Design Pattern que usa uma função em vez de um método estático.
Para olhar mais a fundo, verifique o código-fonte
Então, basicamente, ele não impõe o singleton, mas é um atalho para uma função pública ...
Edit: Na verdade, agora eu entendo. Para compatibilidade com o PHP4, eles tiveram que fazer um hack duplo de variável global para que retornasse as referências corretamente. Caso contrário, as referências ficariam confusas. E como o PHP4 não tinha suporte para métodos estáticos (bem, de maneira apropriada), usar a função era a melhor maneira. Portanto, ainda existe por motivos de legado ...
Portanto, se seu aplicativo for apenas PHP5, não deve haver nada de errado em fazer
CI_Base::get_instance();
, é idêntico ...fonte
$CI =& get_instance();
eu estava batendo minha cara no Docs procurando por isso ...get_instance () é uma função definida nos arquivos principais do CodeIgniter. Você o usa para obter a referência do singleton para o superobjeto CodeIgniter quando você está em um escopo fora do superobjeto.
Tenho certeza de que está definido em base.php ou algo semelhante.
fonte
Apenas a classe que estende CI_Controller, Model, View pode usar
$this->load->library('something'); $this->load->helper('something');//..etc
Sua classe personalizada não pode usar o código acima. Para usar os recursos acima em sua classe personalizada, você deve usar
$CI=&get instance(); $CI->load->library('something'); $CI->load->helper('something');
por exemplo, em sua classe personalizada
// 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.
fonte
esta é uma estrutura singleton para entender como o codeigniter carrega as bibliotecas e 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();
fonte
$ CI = get_instance (); é substituir $ this por $ CI no auxiliar,
fonte