В Codeigniter get_instance()
- это глобально доступная функция, которая возвращает суперобъект Controller, который содержит все загруженные в данный момент классы (он возвращает экземпляр класса Controller).Я включу текущий исходный код:
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
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.
Обычно из функций вашего контроллера вы вызываете любую из доступных функций CodeIgniter, используя конструкцию $this
: $this->load->helper('url'); $this->load->library('session');
$this->config->item('base_url');
и т. Д.
$this
однако работает только непосредственно с контроллерами, моделями или представлениями.Если вы хотите использовать классы CodeIgniter из своих собственных пользовательских классов, вы можете сделать это следующим образом:
Сначала назначьте объект CodeIgniter переменной:
$ CI = & get_instance ();
Как только вы присвоите объект переменной, вы будете использовать эту переменную вместо $this
: $ CI = & get_instance ();$ CI-> load-> помощник ( 'URL');$ CI-> load-> библиотека ( 'сессии');$ CI-> config-> пункт ( 'base_url');и т. д.
Примечание. Вы заметите, что указанная выше функция get_instance()
передается по ссылке:
$ CI = & get_instance ();
Это очень важно. Назначение по ссылке позволяет использовать исходный объект CodeIgniter, а не создавать его копию.
Связанные публикации: объяснение $ CI = & get_instance (); / Codeigniter: Get Instance
Итак, вот мой актуальный вопрос:
Почему руководство пользователя рекомендует присваивать get_instance()
переменной?Я вполне уверен, что понимаю последствия не назначения по ссылке, но почему рекомендуется присваивать его переменной, когда get_instance()->load->model()
работает нормально?
Я вижу много пользовательских или сторонних классовв КИ, которые присваивают свойству объекта:
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()
напрямую?Это кажется подобным тому, как назначение всего объекта Controller переменной класса не было бы хорошей идеей, даже если это ссылка.Возможно, это не имеет значения.
Я хочу написать функцию-обертку для get_instance()
, чтобы ее было проще набирать, и мне не нужно постоянно присваивать ее переменной.
function CI()
{
return get_instance();
}
Или:
function CI()
{
$CI =& get_instance();
return $CI;
}
Тогда я мог бы использовать CI()->class->method()
из любой точки мира без необходимости присваивать его переменной, очень легко написать и понять, что он делает, и это может привести к сокращению,более элегантный код.
- Есть ли причина не использовать этот подход?
- Есть ли какая-либо разница между двумя
CI()
функциями выше? - Почемурекомендовано присвоить
get_instance()
переменной, а не вызывать ее напрямую? - Что означает
&
в function &get_instance(){}
, где она определена?Я немного знаю о том, для чего ссылки , и я использую их, когда это уместно, но я никогда не видел функции, определенной таким образом.Если я напишу функцию-обертку, должен ли я ее использовать?
Обратите внимание, что это не столько вопрос style , сколько технический вопрос.Я хочу знать, есть ли какие-либо проблемы, производительность или иным образом , с использованием метода, который я предлагаю.
РЕДАКТИРОВАТЬ : Пока у нас есть:
- Объединение методов недоступно в php4, поэтому присвоение переменной является обходным решением (хотя это довольно неактуально, поскольку Codeigniter прекратил поддержку php4)
- Незначительные накладные расходы при вызове функции более одного раза для возврата объекта, а не при вызове его один раз и присвоении переменной.
Что-нибудь еще, или это единственные потенциальные проблемы?