3

在我的 bootstrap.php 中有许多 _initX() 函数,其中一些可能包含依赖于先前 initX 中的代码的代码

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

所以我的问题是,这些 _init 函数是否保证按照它们被声明的确切顺序执行?

4

3 回答 3

4

编辑 - 为了对您的问题提供更直接的答案,我会说它们可能会是因为代码使用 ReflectionObjects::getmethods() 或 get_class_methods 取决于您的 PHP 版本,所以我相信那些会按顺序返回函数但那里PHP 文档或 Zend 文档中没有任何东西可以保证这种情况总是如此,所以我不认为这是一个受支持的功能。

您可以传递您想要/需要调用的资源函数的名称作为引导调用的一部分:$bootstrap->bootstrap(array('foo', 'bar'));而不是不传递任何内容,而是让 Zend 应用程序自动调用它们,而您不确定其中的顺序。

但是,如果您的引导资源之间存在依赖关系,我建议您查看资源插件,这将允许您将代码分离到不同的类中,并从您的“bar”资源插件代码中轻松调用 $bootstrap('foo')(尽管您也可以使用 _init*() 函数执行此操作)

资源插件的另一个好处是,如果需要,它们可以与其他引导文件共享,并且它们比 _init*() 函数更容易测试。

确保您阅读Zend Application文档中的操作理论文档

于 2010-11-09T15:11:24.610 回答
1

如果您确实需要以特定顺序调用它们,则应使用帮助列表:

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

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

要在 ZF 中使用该构造,您可以将示例重命名__construct_initOrderedList并将您的自定义重命名_initFunctions_myinit...或其他名称。

于 2010-11-09T14:57:21.670 回答
1

阅读手册。有一个部分称为 Dependency Tracking :

如果一个资源依赖于另一个资源,它应该在其代码中调用 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;
    }
}

您不必依赖订单。

于 2010-11-09T16:35:08.463 回答