объяснить $CI = & получить экземпляр();


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

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

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

5 78

5 ответов:

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

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

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

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

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

в некоторых случаях вы можете разработать классы, которые существуют отдельно от ваших контроллеров, но имеют возможность использовать все ресурсы Code Igniter. Это легко возможно с помощью get_instance () функции.

любой класс, который вы создаете в своих функциях контроллера, может получить доступ к собственным ресурсам Code Igniter просто с помощью функции get_instance (). Эта функция возвращает основной объект воспламенителя кода.

обычно, чтобы вызвать любой из доступные функции воспламенителя кода требуют, чтобы вы использовали $this построить:

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

etc.

это, однако, работает только в ваших контроллерах, ваших моделях или ваших представлениях. Если вы хотите использовать классы Code Igniter из своих собственных пользовательских классов, вы можете сделать это следующим образом:

во-первых, назначьте объект Code Igniter переменной:

$obj =& get_instance();

после того, как вы назначили объект переменной, вы будете использовать эту переменную вместо это:

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

etc.

Примечание: Вы заметите, что выше get_instance () функции передается по ссылке:

$obj =& get_instance();

Это очень важно. Назначение по ссылке позволяет использовать исходный объект Code Igniter, а не создавать его копию.

вы можете прочитать об этой функции из здесь

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

Я уверен, что это определено в базе.PHP или что-то подобное.

это одноэлементная структура, чтобы понять, как 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();

только класс,который расширяет 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.