2008-09-15 12 views
2

クラスAのインスタンスが他のオブジェクトのカップルをインスタンス化し、クラスBから例えば言う:PHPで親オブジェクトのクラス変数にアクセスするにはどうすればよいですか?

$foo = new B(); 

私はいない限り、私はB.

内のメソッドからAの公開クラス変数にアクセスしたいと思います何かが欠けている、これを行うための唯一の方法は、Bのインスタンスに現在のオブジェクトを渡すことです:

$foo = new B($this); 

は、このベストプラクティスですか、これを行うための別の方法は何ですか?

答えて

2

それは私にはうまく見えますが、私は「これを理解している誰かがそれを理解していますか?これは簡単に理解できる解決策です。唯一の「A」があります場合は

して、あなただけの1つのAがある場合、あなたはシングルトンとしてそれを実装することができ、例えばポールが言ったことと同様にhttp://www.phppatterns.com/docs/design/the_registry

+0

ありがとうございます。私の特定のケースでは、登録パターンは実際に適用されます。 (クラスAはいくつかのデータベースリンクを開き、設定情報をBクラスや他のクラスに渡さなければなりません)。 –

1

私はあなたが間違ったパターンを使用していないかどうか最初にチェックします:アプリケーションロジックから、Bは本当にAについて知っていますか? BがAについて知る必要がある場合、親子関係は十分ではないようです。例えば、Aが子供であるか、またはAの論理の一部が、階層のBの「下」にある(すなわち、Bについて知らない)第3のオブジェクトに入る可能性がある。

つまり、Aをデータソースとして登録する方法や、BをObserverとして登録するメソッドを作成し、Bが値のBに通知するために使用するBの一致するメソッドを作成することをお勧めします変更。

0

を参照して、レジストリのパターンを使用することを検討してください可能性があります。次に、Aのインスタンスをコンストラクタ(集約)にセッタメソッド(本質的に再度集計)で渡すか、この関係をコンストラクタ(コンポジション)で直接設定することができます。

しかし、シングルトンは強力ですが、構図でそれらを実装することには注意してください。そのようにしてコンストラクタの引数を取り除くことができると思うのは良いことですが、Aをコードの書き換えなしに何かに置き換えることも不可能になります。 Peronsally、私はこのようなシングルトンを使用して

$foo = new B(A::getInstance()); 
0
$foo = new B($this); 

コードが、残念ながら私のニーズと一致しない場合でも、凝集に固執すると思います。親オブジェクトのプロパティにアクセスする他の方法はありますか?

私は理由を説明しようとします。私たちはゲームソフトを書いており、いくつかのクラスは非常に「珍しい」依存関係を持ち、お互いにさまざまな影響を与えます。そのため、コードは時にはすべてのインスタンスで親にリンクせずに(時には異なるコンテクストの複数の親でさえ、SquadはBattleやUserなどに属しています)、ほとんどサポートできません。

リンクが私を満たさない理由。クライアント側の出力を生成するとき、私はXMLでオブジェクトを直列化することを使用します。それは親にそれらのリンクのような再帰的な参照を満たすまで非常にうまく動作します。私はそれらを保護させることができますが、その後彼らはその使用法を緩める(ダミー例)

$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...); 

他の方法 - すべての直列化可能クラスの直列化メソッドを実装し、このようにシリアライザの内側にそれを呼び出す:

$obj->toXML($node); 
$this->appendChild($node); 

が、それは、書き込むとサポートするために多くのものです!そして、時には、シリアライザのオブジェクトを動的に(トラフィックが少なくて)生成します。

私は、ハッキングについても考えています。シリアライザを特定のクラスのいくつかのプロパティを無視するように「教える」ということです))。うわー...悪い考え...

これは長い議論ですが、レジストリとオブザーバーは合わないと思います。他のアイデアはありますか?