私は、Factoryクラスを使ってオブジェクトのインスタンス化を管理し、コンストラクタに任意の依存オブジェクト(Dependency Injection)を渡しています。PHP OOP ::すべてのクラスにアクセス可能なグローバル設定値を保持する
function createBasket() {
//pass in dependent objects
$apiCon = $this->createAPIConnector($this);
$basket = new Basket($this, $apiCon);
return $basket;
}
私は、よりシンプルで堅牢なユニットテストを可能にするために、(工場以外)の任意のクラス内の「新しい」キーワードを使用しないようにしようとしています、明確なコードなど
さて、私の質問はに関し、多くのクラスが必要とする設定値
$apiURL = 'http://some.api.com';
$apiKey = 'abcde12345';
$adminEmail = '[email protected]';
これらの値は、アプリケーションインスタンスごとに一定です。私は現在、シングルトンクラスConfigでそれらを持っていると、彼らは従うことによって、任意のクラス内から到達可能である:
$cfg = Config::getInstance();
$address = $cfg->apiURL;
しかし、このクラスのインスタンスはまだそれを呼び出す任意のクラス内の依存関係ですので、私は合格を考える必要がありますこれをクラスコンストラクタに
function createBasket() {
//pass in dependent objects
$apiCon = $this->createAPIConnector($this);
$cfg = Config::getInstance();
//pass singleton config object to constructor
$basket = new Basket($this, $apiCon, $cfg);
return $basket;
}
...または多分むしろ、コンストラクタ経由よりも、setメソッドを経由して、それらを渡す:
function createBasket() {
//pass in dependent objects
$apiCon = $this->createAPIConnector($this);
$basket = new Basket($this, $apiCon);
//pass singleton config object to setter
$basket.setConfig(Config::getInstance());
return $basket;
}
最良の方法上の任意のガイダンスははるかに高く評価されるだろう。
ありがとう、ジェームズ
* [symfonyコンポーネント依存性注入コンテナ](http://components.symfony-project.org/dependency-injection) – Gordon
依存性注入は行く方法 – DrDol