объяснить $ CI = & get_instance (); - PullRequest
81 голосов
/ 19 января 2011

Просмотр исходного кода codeigniter,

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

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

Ответы [ 5 ]

70 голосов
/ 19 января 2011

Это в основном Singleton Design Pattern , который использует функцию вместо статического метода.

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

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

Редактировать: Собственно, теперь я понимаю. Для совместимости с PHP4 они должны были выполнить double-global-variable-hack , чтобы заставить его правильно возвращать ссылки. В противном случае ссылки будут испорчены. А поскольку в PHP4 не было поддержки статических методов (ну, в любом случае, правильно), использование функции было лучшим способом. Так что оно все еще существует по наследству ...

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

18 голосов
/ 19 января 2011

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

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

3 голосов
/ 23 июня 2015

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

Только класс, который расширяет 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.
1 голос
/ 27 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...