объясните $ CI = & get_instance ();


86

Просматривая исходный код codeigniter,

в его вспомогательных функциях я все время вижу код, $CI =& get_instance(); может ли кто-нибудь объяснить мне, как работает этот код?

Я понимаю, что он возвращает ссылку на суперобъект $ CI, но откуда он get_instance()взялся?


Прочтите stackoverflow.com/a/63914758/2943403, чтобы понять, почему вам не следует =&нигде писать в своем проекте.
mickmackusa

Ответы:


73

По сути, это шаблон проектирования Singleton, который использует функцию вместо статического метода.

Чтобы заглянуть глубже, посмотрите исходный код

По сути, он не применяет синглтон, но это ярлык для публичной функции ...

Изменить: На самом деле, теперь я понимаю. Для совместимости с PHP4 им пришлось сделать взлом с двойной глобальной переменной, чтобы заставить его правильно возвращать ссылки. В противном случае ссылки будут испорчены. А поскольку в PHP4 не было поддержки статических методов (ну, по крайней мере, правильно), использование функции было лучшим способом. Так что он все еще существует по наследственным причинам ...

Итак, если ваше приложение работает только на PHP5, вместо этого не должно быть ничего плохого CI_Base::get_instance();, оно идентично ...


2
Когда использовать суперобъект CI и почему? Не могли бы вы указать мне на некоторую документацию по CI, касающуюся суперобъекта CI?
Girish

1
+1 за то, что на самом деле указал на использование ЗАМЕНЫ, потому что $CI =& get_instance();я бился лицом о Документы, ища это ...
HomeOffice

@Bugfixer Когда вы увидите эту ошибку 404, отредактируйте эту ссылку с помощью web.archive.org . Уже сделано для этой ссылки
я самый глупый человек

20

get_instance () - это функция, определенная в основных файлах CodeIgniter. Вы используете его для получения одноэлементной ссылки на суперобъект CodeIgniter, когда вы находитесь в области за пределами суперобъекта.

Я почти уверен, что он определен в base.php или чем-то подобном.


6

Только класс, расширяющий CI_Controller, Model, View, может использовать

$this->load->library('something');
$this->load->helper('something');//..etc

Ваш настраиваемый класс не может использовать приведенный выше код. Чтобы использовать вышеуказанные функции в своем пользовательском классе, вы должны использовать

$CI=&get instance();
$CI->load->library('something');
$CI->load->helper('something');

например, в вашем пользовательском классе

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

4

это одноэлементная структура, чтобы понять, как codeigniter загружает библиотеки и классы

<?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();

1

$ CI = get_instance (); заменить $ this на $ CI на помощнике,


но вы должны определить своего помощника при автозагрузке [библиотека]
Тофан,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.