2

クラスAのインスタンスは、たとえばクラスBから、他のいくつかのオブジェクトをインスタンス化します。

$foo = new B();

B内のメソッドからAのパブリッククラス変数にアクセスしたいと思います。

何かが足りない場合を除いて、これを行う唯一の方法は、現在のオブジェクトをBのインスタンスに渡すことです。

$foo = new B($this);

これはベストプラクティスですか、それともこれを行う別の方法がありますか?

4

4 に答える 4

2

それは私には問題ないように見えます。これは簡単に理解できる解決策です。

「A」が 1 つしかない場合は、レジストリ パターンの使用を検討できます。たとえば、http://www.phppatterns.com/docs/design/the_registryを参照してください。

于 2008-09-15T11:56:50.853 に答える
1

最初に、間違ったパターンを使用していないかどうかを確認します。アプリケーション ロジックから、B は本当に A について知っている必要がありますか? B が A について知る必要がある場合、親子関係は十分ではないようです。たとえば、A が子である場合や、A のロジックの一部が、階層内で B の「下」にある (つまり、B を認識していない) 3 番目のオブジェクトに移動する場合があります。

つまり、B に A をデータ ソースとして登録するメソッドを用意するか、A に B をオブザーバーとして登録するメソッドを作成し、A がB に値の変更を通知するために使用するマッチング メソッドを作成することをお勧めします。

于 2008-09-15T11:52:35.073 に答える
0

Paul が言ったことと同様に、A が 1 つしかない場合は、それをシングルトンとして実装できます。その後、A のインスタンスを引数としてコンストラクター (集約) に渡すか、setter メソッド (本質的には集約) を使用するか、この関係をコンストラクター (構成) で直接設定することができます。

ただし、シングルトンは強力ですが、コンポジションで実装する場合は注意してください。そのようにしてコンストラクターの引数を取り除くことができると考えるのは良いことですが、コードを書き直さないと A を別のものに置き換えることもできなくなります。個人的には、シングルトンを使用していても、集約に固執します

$foo = new B( A::getInstance() );
于 2008-09-16T19:49:29.803 に答える