в CodeCigigniter, Get_Instance ()
- это глобально доступная функция, которая возвращает супер-объект контроллера, который содержит все текущие загруженные классы (возвращает экземпляр класса контроллера). Я включаю текущий исходный код:
Get_Instance ()
определен в Codeigniter.php
// Load the base controller class
require BASEPATH.'core/Controller.php';
function &get_instance()
{
return CI_Controller::get_instance();
}
и CI_CONTROLLER
Controller.php Controller.php
class CI_Controller {
private static $instance;
/**
* Constructor
*/
public function __construct()
{
self::$instance =& $this;
// Assign all the class objects that were instantiated by the
// bootstrap file (CodeIgniter.php) to local class variables
// so that CI can run as one big super object.
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->set_base_classes()->ci_autoloader();
log_message('debug', "Controller Class Initialized");
}
public static function &get_instance()
{
return self::$instance;
}
}
Вот как он рекомендуется использовать в руководстве пользователя для создания библиотек :
Использование ресурсов Codeigniter в вашей библиотеке
для доступа к родным ресурсам Codeigniter в вашей библиотеке
Get_Instance ()
Функция. Эта функция возвращает Codeigniter Super объект.Обычно изнутри функции вашего контроллера вы будете вызывать любой из Доступные функции Codeigniter с использованием
$ это
.$ this-> load-> helper ('URL'); $ this-> load-> библиотека (сеанс '); $ this-> config-> item ('base_url');
и т. Д.
$ Это
, однако, работает только непосредственно внутри ваших контроллеров, ваш модели или ваши взгляды. Если вы хотите использовать классы Codeigniter Из-за собственных пользовательских классов вы можете сделать это следующим образом:Сначала назначьте объект Codeigniter к переменной:
$ CI = & get_Instance ();
Как только вы присваиваете объект переменной , вы будете использовать это Переменная вместо
$ это
: $ CI = & get_Instance (); $ Ci-> Load-> Helper ('URL'); $ Ci-> Load-> Библиотека («сессия»); $ Ci-> Config-> item ('base_url'); и т. д.Примечание. Вы заметите, что вышеупомянутое
функция get_Instance ()
Пройдено по ссылке:$ CI = & get_Instance ();
Это очень важно. Присвоение по ссылке позволяет использовать Оригинальный объект Codeigniter, а не создает копию.
Связанные Сообщения: Объясните $ CI = & get_Instance (); / Codeigniter: Получить экземпляр
Итак, вот мой фактический вопрос:
Почему пользовательское руководство рекомендует присвоить Get_Instance ()
к переменной? Я довольно уверен, что я понимаю последствия не присвоения ссылки, но почему рекомендуется присвоить его переменной, когда Get_Instance () -> Load-> Model ()
работает нормально?
Я вижу много пользователей или третьих сторонних классов в CI, которые назначают свойство объекта:
class MY_Class {
private $CI;
function __construct()
{
$this->CI =& get_instance();
}
function my_func()
{
$this->CI->load->view('some_view');
}
function my_other_func()
{
$this->CI->load->model('some_model');
}
}
плохой пример, но я вижу это часто. Зачем беспокоить этот метод вместо того, чтобы просто звонить Get_Instance ()
напрямую? Это , похоже, Как и присвоение всего объекта контроллера к переменной класса, не будет отличной идеей, даже если это ссылка. Может быть, это не имеет значения.
Я хочу написать функцию обертки для get_Instance ()
Так что легче ввести, и мне не нужно постоянно назначать его переменной.
function CI()
{
return get_instance();
}
Или:
function CI()
{
$CI =& get_instance();
return $CI;
}
Тогда я мог бы использовать CI () -> класс-> метод ()
из любой точки без хлопота присвоения его переменной, очень легко написать и понять, что это делает и может привести к более короткому, более элегантному коду.
CI ()
функциями выше? Get_Instance ()
В переменной, а не вызывая его напрямую? &
в и
в функция & get_Instance () {}
, что он определен? Я немного знаю о том, что ссылки , и я использую их при необходимости, но я никогда не видел функции, определенную таким образом. Если я напишу функцию обертки, должен ли я использовать это тоже? Обратите внимание, что это не так много стиль , но технический. Я хочу знать, есть ли какие-либо проблемы, производительность или иным образом , с использованием метода, который я предлагаю.
Редактировать : до сих пор мы имеем:
Что-нибудь еще, или эти единственные потенциальные проблемы?