在我的bootstrap.php我有很多_initX()函數,其中一些可能包含取決於代碼在前面INITX待辦事項_initX()函數被調用的順序
protected function _initAutoloading() { }
protected function _initViewInitializer() { }
protected function _initVariables() { }
所以我的問題代碼,這些_init函數是否保證按照聲明的順序執行?
在我的bootstrap.php我有很多_initX()函數,其中一些可能包含取決於代碼在前面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 DOC
如果你真的需要他們在一個特定的順序調用,你應該使用一個輔助列表:
var $init_us = array(
"_initAutoloading",
"_initViewInitializer",
"_initVariables",
);
function __construct() {
foreach ($this->init_us as $fn) {
$this->{$fn}();
}
}
要使用ZF是構建你可以到_initOrderedList
的例子__construct
和您的自定義_initFunctions
重命名爲_myinit...
或一些東西。
jblue,他們答應在手冊中訂購執行嗎? – 2010-11-09 15:22:48
如果沒有明確說明,我也會說你不應該依賴它。 – mario 2010-11-09 15:33:46
閱讀theory of operation文檔閱讀manual。有一部分稱爲依賴關係跟蹤:
如果資源依賴於另一個資源,它應該在其代碼中調用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:這是完全正確的(發現困難的方式:)) – 2010-11-09 16:22:54