开发者

Do _initX() functions get called in sequence

开发者 https://www.devze.com 2023-01-24 18:31 出处:网络
In my bootst开发者_开发问答rap.php I have many _initX() functions, and some of them may contain code that depends on code in the previous initX

In my bootst开发者_开发问答rap.php I have many _initX() functions, and some of them may contain code that depends on code in the previous initX

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

So my question, are these _init functions guaranteed to be executed in the exact order they've been declared?


EDIT - To provide a more direct answer to your question, I would say that they probably will be since the code uses ReflectionObjects::getmethods() or get_class_methods depending on your PHP version, so I believe those will return the function in order but there is nothing in the PHP docs or Zend docs that guarantee this will always be the case, so I would not consider this a supported feature.

You can pass the names of the resource functions you want/need to call as part of the bootstrap call: $bootstrap->bootstrap(array('foo', 'bar')); instead of not passing anything and let the Zend Application call them all automatically in which you are not sure of the order.

If you have dependencies in between your bootstrap resources however, I suggest you look at Resource plugins which will allow you to separate your code in different classes and easily call $bootstrap('foo') from within your 'bar' resource plugin code (though you can do so with the _init*() functions as well)

Another benefit of resource plugins is they can be shared with other bootstrap files if you need to and they are easier to test than _init*() functions.

Make sure you read theory of operation document from the Zend Application doc


If you really need them invoked in a particular order, you should use a helper list:

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

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

To use that construct in ZF you could rename the example __construct into _initOrderedList and your custom _initFunctions into _myinit... or something.


Read the manual. There are a section called Dependency Tracking :

If a resource depends on another resource, it should call bootstrap() within its code to ensure that resource has been executed. Subsequent calls to it will then be ignored.

Here is sample code :

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;
    }
}

You don't have to rely on the order.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号