0

私のアプリケーションには単一のエントリポイントがあり、それを呼び出しましょうindex.php

そのindex.php中で、以下のようなクラスをインスタンス化します。

final class Griff {

    public $a, $b, $c, $d, $e;

    public function __construct() {
         spl_autoload_register(array($this, 'autoload',));
         $this->a = 'a';
         // blah blah blah
         new RouterGriff($this);
    }

    private function autoload($name) {
         // autoload function
    }
}

new Griff();

RouterGriff内部Griff::__construct()でインスタンス化されていることに気付くでしょうRouterGriff。以下のようになります。

final class RouterGriff {

    private $griff;

    public function __construct(Griff $griff) {
         $this->griff = $griff;
         $this->griff->b = 'b';
         $this->griff->c = 'c';
    }
}

私の質問は次のとおりです。アプリケーションにレジストリのような構造が必要であるが、シングルトンを使用したくないため、Griffから格納されるプロパティの変数を設定していることに気付くでしょう。RouterGriff

RouterGriff代わりにプロパティを設定した方がいいでしょうGriffか?または、アプリケーションが何かを出力する前に10クラス深くなる可能性があることを考えると、Griffすべてのクラスに物事を行うための有効な方法を渡すことはできますか?

私は理にかなっていると思いますそしてありがとう

編集

逆に、私はこのようにそれを行うことをメンションします、

final class Griff {

    public $a;

    public function __construct() {
         spl_autoload_register(array($this, 'autoload',));
         $this->a = 'a';
         // blah blah blah
         new RouterGriff();
    }

    private function autoload($name) {
         // autoload function
    }
}

new Griff();

final class RouterGriff {

    public $b, $c;

    public function __construct() {
         $this->b = 'b';
         $this->c = 'c';
    }
}
4

3 に答える 3

1

あなたが探している質問への答えは、「依存性注入」または「依存性注入コンテナ」と呼ばれています。これは幅広いトピックを満たす本です。このトピックに興味がある場合は、次のことをお勧めします。Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin)

于 2012-07-21T20:49:08.710 に答える
0

私はあなたGriffが素晴らしいものすべてに注入することについてあなたが間違っているとは思わない。どのクラスがどのプロパティを取得するかに関しては、プロパティの性質に依存すると思います。たとえばGriffRequest、この例には、ルーターが提供する解析済みパラメーターにアクセス/保存する場所を含めます。

final class Griff {

    protected $_request,
              $_response,
              $_router;

    public function __construct() {
         spl_autoload_register(array($this, 'autoload',));
         $this->_request = new GriffRequest($this);
         $this->_response = new GriffResponse($this);
         $this->_router = new RouterGriff($this);
    }

    private function autoload($name) {
         // autoload function
    }

    public function getRequest() {  return $this->_request; }

    public function getResponse() {  return $this->_response; }

    public function getRouter() {  return $this->_router; }
}


final class RouterGriff {

    protected $_application;

    public function __construct(Griff $application) {
         $this->_application = $application;
    }

    public function route() {
        // do stuff with request
        // assign params
        $request = $application->getRequest();
        $request->a = 'value';
        $request->b = 'value2';
    }
}

アプリのすべての重要なサブモジュールへの参照をGriff保存し、それらすべてのモジュールに挿入すると、ある時点でGriff必要になる可能性のあるすべてのものにアクセスできます。Griffチェーンが長すぎると感じたら、いつでも便利なゲッターを作ることができます。

于 2012-07-21T20:52:55.663 に答える
0

あなたがグローバルなアプリケーション設定について話しているのであれば(私はあなただと思います)、定数を使用してください。

それらはグローバルですが、変更することはできず、簡単に作成して使用できます。

于 2012-07-21T20:10:16.997 に答える