it-swarm.com.ru

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

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

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

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

81
Hailwood

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

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

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

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

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

70
ircmaxell

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

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

18
Wade

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

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

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

1
Tofan