explicar $ CI = & get_instance ();

86

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?

Hailwood
fonte
Leia stackoverflow.com/a/63914758/2943403 para entender por que você não deve escrever =&em nenhum lugar do seu projeto.
mickmackusa,

Respostas:

73

É 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 ...

ircmaxell
fonte
2
Quando usar o superobjeto CI e por quê? Você pode me indicar alguma documentação de CI sobre o superobjeto de CI?
Girish
1
+1 para realmente apontar para o uso de SUBSTITUIÇÃO porque $CI =& get_instance();eu estava batendo minha cara no Docs procurando por isso ...
HomeOffice
@Bugfixer Quando você ver o erro 404, edite esse link usando web.archive.org . Já fiz esse link
Eu sou a pessoa mais estúpida
20

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.

Wade
fonte
6

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

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();
souparno majumder
fonte
1

$ CI = get_instance (); é substituir $ this por $ CI no auxiliar,

Abanar
fonte
mas você deve definir seu ajudante em autoload [biblioteca]
Tofan