変数を渡すことができません。これは大変な作業になります。
よろしいですか?人々は、依存関係を渡す努力を過大評価する傾向があります。コンストラクターでそれを行う場合、通常はかなり簡単に行うことができます。
とは言うものの、phpではさまざまな方法で共有機能をグローバルスコープに入れることができます。最も簡単なのは、グローバル関数を使用することです。例えば。どのクラスにも属していない関数。もう1つのオプションは、静的クラスメソッドを使用することです。これら2つは非常に似ています。それらの構文を除いて、それらは本質的に同じプロパティを持っています。少し緩い結合ソリューションは、具象クラスが拡張する(抽象)基本クラスにメソッドとして機能を配置することです。これにより、すべての子クラス間で機能が共有されます。
上記のソリューションに共通するのは、コンパイル時のカップリングがあることです。実行時に依存関係を変更することはできません。これにより、アプリケーションはかなり厳格になります。彼らの主な利点は、彼らが抱える複雑さのレベルが低いことです。
より緩く結合されたアプリケーションが必要な場合は、ハード依存関係を変数に置き換えて、間接的なレベルを与えることができます。簡単なのは、オブジェクトを作成し、これをアプリケーション全体でグローバルに共有することです。global
PHPでこれを行うには、シングルトンやグローバルスコープの変数など、いくつかの方法があります(これには、キーワードを使用するか、$GLOBALS
配列を介してアクセスできます)。
グローバル変数はある程度の間接参照を提供しますが、アプリケーションのどの部分が相互に依存しているかを把握するのが非常に困難になるため、多くの複雑さをもたらす傾向があります。このため、経験豊富なプログラマーはそれらを避けることがよくあります。これは、変数に状態がある場合に特に当てはまります。共有オブジェクトがステートレスの場合、この問題はそれほど一般的ではありません。
グローバル変数の危険を回避する唯一の方法は、代わりにローカル変数を使用することです。例えば。依存関係を渡すため。これは少し面倒かもしれませんが、私の経験では、多くの場合、それが想定されているほど大きな問題ではありません。少なくとも、多くの場合、メリットが問題を上回ります。とはいえ、痛みを和らげるテクニックがあります。特に依存性注入コンテナは、すべての配線を自動的に処理する自動ファクトリです。ただし、独自のレベルの複雑さがありますが、大規模なアプリケーションの場合は、確かに優れたソリューションになる可能性があります。