Как работает класс динамической загрузки CodeIgniters? - PullRequest
0 голосов
/ 17 февраля 2012

Я пытаюсь создать свою собственную простую инфраструктуру MVC, в основном для образовательных целей, чем что-либо еще, в прошлом я использовал CodeIgniter, который послужил источником вдохновения для функций, которые я хотел бы включить в свою среду.

Я хотел бы создать класс загрузчика, такой как CodeIgniters, но я не могу понять, как CI загружает классы, как если бы они были свойствами вызывающего класса, т. Е.

class Random_Controller{

    function __construct(){
    $this->load->helper('some_class');
    $this->some_class->do_something();
    /*
    How does CI load some_class as if it were a property of Random_Controller?
    I can understand using something like $$class_name = new $class_name();
    Or $$this->class_name = new $class_name();
    But how can the dynamically named object be used with $this->?
    */
    }
}

Надеюсь, это имеет смысл ...

Я всегда удивляюсь тому, как простые вещи появляются с правильным объяснением. Еще один вопрос.

Если $ load является ссылкой на экземпляр класса загрузки, и запись всех загруженных классов хранится в массиве, мы по существу делаем: $ this-> loaded_classes [$ ключ] -> do_something ()?

Так, как CI разрешает массив к имени переменной? Я видел некоторые магические методы PHP, которые вызываются, когда переменные не существуют или методы не существуют, будет ли это сделано в сочетании с этими магическими методами? Другими словами, если свойство $ this-> some_class не существует, мы ищем элемент в массиве с этим ключом?

Если это имеет смысл ..

1 Ответ

1 голос
/ 17 февраля 2012

Хм, ну, давайте начнем с этого: суперкласс CI_Controller;это тот, который расширяет все контроллеры и действует как суперобъект CI для всех $, к которым это относится.

CI_Controller действует как синглтон, и во время инициализации он вызывает функцию load_class() (вы можете найти вcommon.php), который работает как автозагрузчик : внутри статического массива ($ _classes) он присваивает в качестве индекса имя класса и в качестве значения экземпляр класса:

$_classes[$class] = new $name();

Затемсопутствующая is_loaded() функция (в том же файле) регистрирует в массиве всю загруженную функцию и используется для проверки позже, если класс уже был создан или нет.

Ci_Controller назначает его свойству $ loadэкземпляр класса Loader (core / loader.php, с использованием вышеуказанного механизма)

$this->load =& load_class('Loader', 'core');

, который, в свою очередь, отвечает за загрузку всех других ресурсов, используя свои собственные методы: helper (), library(), модель () и так далее.Посмотрите на источник для всех деталей, надеюсь, что вы получили картинку, хотя

Чтобы уточнить согласно вашему комментарию:

$load = new Loader();
$load->helper('helper');

будет таким же, как:

$this->load->helper('helper'),

, поскольку $this->load содержит экземпляр (по ссылке) класса Loader.Тогда как методы helper (), library () и т. Д. Класса Loader было бы слишком много, чтобы писать здесь, кроме того, вы можете открыть файл Loader.php и посмотреть сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...