Просматривая исходный код codeigniter,
в его вспомогательных функциях я все время вижу код,
$CI =& get_instance();
может ли кто-нибудь объяснить мне, как работает этот код?
Я понимаю, что он возвращает ссылку на суперобъект $ CI, но откуда он get_instance()
взялся?
php
codeigniter
Hailwood
источник
источник
=&
нигде писать в своем проекте.Ответы:
По сути, это шаблон проектирования Singleton, который использует функцию вместо статического метода.
Чтобы заглянуть глубже, посмотрите исходный код
По сути, он не применяет синглтон, но это ярлык для публичной функции ...
Изменить: На самом деле, теперь я понимаю. Для совместимости с PHP4 им пришлось сделать взлом с двойной глобальной переменной, чтобы заставить его правильно возвращать ссылки. В противном случае ссылки будут испорчены. А поскольку в PHP4 не было поддержки статических методов (ну, по крайней мере, правильно), использование функции было лучшим способом. Так что он все еще существует по наследственным причинам ...
Итак, если ваше приложение работает только на PHP5, вместо этого не должно быть ничего плохого
CI_Base::get_instance();
, оно идентично ...источник
$CI =& get_instance();
я бился лицом о Документы, ища это ...get_instance () - это функция, определенная в основных файлах CodeIgniter. Вы используете его для получения одноэлементной ссылки на суперобъект CodeIgniter, когда вы находитесь в области за пределами суперобъекта.
Я почти уверен, что он определен в base.php или чем-то подобном.
источник
Только класс, расширяющий 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.
источник
это одноэлементная структура, чтобы понять, как 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 = get_instance (); заменить $ this на $ CI на помощнике,
источник