Intereting Posts
Прочитать текстовый файл с php Как создать общую базу данных, макет которой может меняться со временем? Использование арабских символов ctype_alnum Открыть файл, записать в файл, сохранить файл в виде zip и потока для пользователя для загрузки Как получить данные наведения (ajax) с помощью любого сканера php Как заставить WordPress опубликовать URL-адрес изображения Ошибка PDO: «SQLSTATE : общая ошибка« При обновлении базы данных Не удается получить доступ к XML-документу с помощью simplexml_load_file () системное время отличается от временной отметки apache -? mysqli_real_escape_string () ожидает, что параметр 1 будет mysqli, boolean заданный набор Создание многоуровневого массива с использованием parentIds в PHP вывод print_r в переменную Операция MySQL занимает более минуты, чтобы выполнить Конвертация валюты с использованием PHP Переход туда, где отсутствует PHP parse_url (), – анализ только домена

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

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

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

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

Solutions Collecting From Web of "объяснить $ CI = & get_instance ();"

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

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

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

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

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

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

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

Обычно для вызова любой из доступных функций Code Igniter требуется использовать эту конструкцию $ :

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

и т.п.

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

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

 $obj =& get_instance(); 

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

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

и т.п.

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

 $obj =& get_instance(); 

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

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

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

Я уверен, что он определен в base.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 - $this->load->library('something'); $this->load->helper('something');//..etc 

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

 $CI=&get instance(); $CI->load->library('something'); $CI->load->helper('something'); - $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. - // 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. - // 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. - // 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. - // 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.