在我的 bootstrap.php 中有许多 _initX() 函数,其中一些可能包含依赖于先前 initX 中的代码的代码
protected function _initAutoloading() { }
protected function _initViewInitializer() { }
protected function _initVariables() { }
所以我的问题是,这些 _init 函数是否保证按照它们被声明的确切顺序执行?
在我的 bootstrap.php 中有许多 _initX() 函数,其中一些可能包含依赖于先前 initX 中的代码的代码
protected function _initAutoloading() { }
protected function _initViewInitializer() { }
protected function _initVariables() { }
所以我的问题是,这些 _init 函数是否保证按照它们被声明的确切顺序执行?
编辑 - 为了对您的问题提供更直接的答案,我会说它们可能会是因为代码使用 ReflectionObjects::getmethods() 或 get_class_methods 取决于您的 PHP 版本,所以我相信那些会按顺序返回函数但那里PHP 文档或 Zend 文档中没有任何东西可以保证这种情况总是如此,所以我不认为这是一个受支持的功能。
您可以传递您想要/需要调用的资源函数的名称作为引导调用的一部分:$bootstrap->bootstrap(array('foo', 'bar'));
而不是不传递任何内容,而是让 Zend 应用程序自动调用它们,而您不确定其中的顺序。
但是,如果您的引导资源之间存在依赖关系,我建议您查看资源插件,这将允许您将代码分离到不同的类中,并从您的“bar”资源插件代码中轻松调用 $bootstrap('foo')(尽管您也可以使用 _init*() 函数执行此操作)
资源插件的另一个好处是,如果需要,它们可以与其他引导文件共享,并且它们比 _init*() 函数更容易测试。
确保您阅读Zend Application文档中的操作理论文档
如果您确实需要以特定顺序调用它们,则应使用帮助列表:
var $init_us = array(
"_initAutoloading",
"_initViewInitializer",
"_initVariables",
);
function __construct() {
foreach ($this->init_us as $fn) {
$this->{$fn}();
}
}
要在 ZF 中使用该构造,您可以将示例重命名__construct
为_initOrderedList
并将您的自定义重命名_initFunctions
为_myinit...
或其他名称。
阅读手册。有一个部分称为 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;
}
}
您不必依赖订单。