get_Instance () в Codeigniter: зачем назначать его переменной?

в 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 () {} , что он определен? Я немного знаю о том, что ссылки , и я использую их при необходимости, но я никогда не видел функции, определенную таким образом. Если я напишу функцию обертки, должен ли я использовать это тоже?

Обратите внимание, что это не так много стиль , но технический. Я хочу знать, есть ли какие-либо проблемы, производительность или иным образом , с использованием метода, который я предлагаю.

Редактировать : до сих пор мы имеем:

  • цепочка метода не доступна в PHP4,Таким образом, присвоение переменной является обходной путь (хотя это довольно не имеет значения, поскольку Codeigniter снизил поддержку PHP4)
  • незначительные накладные расходы на вызов функции более одного раза, чтобы вернуть объект, а не вызывать его один раз и присвоение переменной.

Что-нибудь еще, или эти единственные потенциальные проблемы?

58
задан Community 23 May 2017 в 10:31
поделиться