Функции _initX () вызываются последовательно - PullRequest
3 голосов
/ 09 ноября 2010

В моем файле bootstrap.php у меня много функций _initX (), и некоторые из них могут содержать код, который зависит от кода в предыдущем initX

protected function _initAutoloading() { }
protected function _initViewInitializer() { }
protected function _initVariables() { }

Итак, мой вопрос, гарантированно ли выполняются эти _init-функции в том порядке, в котором они были объявлены?

Ответы [ 3 ]

4 голосов
/ 09 ноября 2010

РЕДАКТИРОВАТЬ - Чтобы дать более прямой ответ на ваш вопрос, я бы сказал, что они, вероятно, будут, так как код использует ReflectionObjects :: getmethods () или get_class_methods в зависимости от вашей версии PHP, поэтому я полагаю, что те вернут функцию в порядок, но в документах PHP или Zend есть ничто , которые гарантируют, что так будет всегда, поэтому я бы не стал рассматривать эту функцию как поддерживаемую.

Вы можете передать имена функций ресурсов, которые вы хотите / должны вызвать, как часть вызова начальной загрузки: $bootstrap->bootstrap(array('foo', 'bar')); вместо того, чтобы ничего не передавать, и позволить Zend-приложению вызывать их все автоматически, в чем вы не уверены в заказ.

Однако, если у вас есть зависимости между вашими ресурсами начальной загрузки, я предлагаю вам взглянуть на плагины Resource, которые позволят вам разделить код по разным классам и легко вызывать $ bootstrap ('foo') из вашего плагина ресурсов 'bar' код (хотя вы можете сделать это и с помощью функций _init * ())

Еще одним преимуществом плагинов ресурсов является то, что они могут использоваться совместно с другими файлами начальной загрузки, и их проще тестировать, чем функции _init * ().

Обязательно прочитайте Теорию работы Документ из Zend Application Документ

1 голос
/ 09 ноября 2010

Прочтите руководство . Есть раздел под названием «Отслеживание зависимостей»:

Если ресурс зависит от другого ресурса, он должен вызвать bootstrap () в своем коде, чтобы убедиться, что ресурс был выполнен. Последующие вызовы будут игнорироваться.

Вот пример кода:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initRequest()
    {
        // Ensure the front controller is initialized
        $this->bootstrap('FrontController');

        // Retrieve the front controller from the bootstrap registry
        $front = $this->getResource('FrontController');

        $request = new Zend_Controller_Request_Http();
        $request->setBaseUrl('/foo');
        $front->setRequest($request);

        // Ensure the request is stored in the bootstrap registry
        return $request;
    }
}

Вам не нужно полагаться на заказ.

1 голос
/ 09 ноября 2010

Если вам действительно нужно, чтобы они вызывались в определенном порядке, вы должны использовать вспомогательный список:

var $init_us = array(
    "_initAutoloading",
    "_initViewInitializer",
    "_initVariables",
);

function __construct() {
    foreach ($this->init_us as $fn) { 
        $this->{$fn}();
    }
}

Чтобы использовать эту конструкцию в ZF, вы можете переименовать пример __construct в _initOrderedList и вашобычай _initFunctions в _myinit... или что-то.

...