3

私の bootstrap.php には、多くの _initX() 関数があり、それらのいくつかには、以前の initX のコードに依存するコードが含まれている場合があります。

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

私の質問は、これらの _init 関数は、宣言された正確な順序で実行されることが保証されていますか?

4

3 に答える 3

4

編集 - あなたの質問に対するより直接的な答えを提供するために、PHPバージョンに応じてコードが ReflectionObjects::getmethods() または get_class_methods を使用しているため、おそらくそうなると思います。したがって、それらは関数を順番に返すと思いますが、PHP ドキュメントや Zend ドキュメントには、これが常に当てはまることを保証するものは何もないため、これをサポートされている機能とは見なしません。

ブートストラップ呼び出しの一部として、呼び出したい/必要なリソース関数の名前を渡すことができます。$bootstrap->bootstrap(array('foo', 'bar'));何も渡さない代わりに、Zend アプリケーションがそれらをすべて自動的に呼び出すようにします。

ただし、ブートストラップ リソース間に依存関係がある場合は、コードを異なるクラスに分離し、'bar' リソース プラグイン コード内から $bootstrap('foo') を簡単に呼び出すことができるリソース プラグインを確認することをお勧めします (ただし、 _init*() 関数でも同様に実行できます)

リソース プラグインのもう 1 つの利点は、必要に応じて他のブートストラップ ファイルと共有でき、_init*() 関数よりも簡単にテストできることです。

Zend Application docの操作理論に関するドキュメントを必ず読んでください。

于 2010-11-09T15:11:24.610 に答える
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 に答える
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 に答える