2017-06-29 4 views
0

コードスニペットは、千の言葉の価値があります明示的に参照をメンバー変数に渡すか、またはの反映を使用しますか?のアクセス所有するオブジェクトは、

+2

いいえ、クリーンな方法はありません。技術的には、$ this-> bar = new Bar($ this);を実行することができます。しかし、複数のレベル(それらのうちの1つは "コンストラクターで新しい"を持っています)でひどい考えです。 –

+3

'$ baz = $ this-> bar' - 今何? 「所有するオブジェクト」のようなものはありません。 – deceze

+0

@decezeなぜそれが私たちのように許可しないように、hermetmetを作成されます。 あなたはそれが必要な理由は何ですか?これは悪い習慣です。もしそのデータにアクセスしたいのであれば、$ barの値を返す 'protected function getBar():Bar'が必要です。 – timiTao

答えて

0

ここでは反射は役に立ちません。

とにかくリクエストは意味をなさない。 Bar::getFoo()の実装が実装されていると仮定します。次のような状況では、何を返すべきですか?

  1. Barオブジェクトは、任意Fooオブジェクト外に作成される:

    $bar = new Bar(); 
    $bar->getFoo();   // ?? 
    
  2. BarオブジェクトがFooオブジェクトによって作成され、それは別のFooオブジェクトにリンクされている:

    $foo1 = new Foo(); 
    $foo2 = new Foo(); 
    $foo2->copyBar($foo1); 
    
    class Foo { 
        // ... 
        public function copyBar(Foo $foo) { $this->bar = $foo->bar; } 
    } 
    

あなたの問題に対する唯一の正しい解決策は、それがBarオブジェクトのコンストラクタにFooオブジェクトを渡すとBarオブジェクトが作成Fooオブジェクトへの後方参照を保つようにすることです(と所有している):

class Foo { 
    private $bar; 

    public function __construct() { 
     $this->bar = new Bar($this); 
    } 
} 

class Bar { 
    private $foo; 

    public function __construct(Foo $foo) { 
     $this->foo = $foo; 
    } 

    public function getFoo() { 
     return $this->foo;   // of course 
    } 
} 
+0

の埋め込みドキュメントから所有するドキュメントにアクセスすることです。これは私がこれまで使ってきた解決策ですが、これを行うことができるかどうかは疑問でした。明示的に参照を渡す*。手作業であることに加えて、所有するオブジェクトがメンバ変数オブジェクト( '$ foo-> bar')に簡単にアクセスすることができますが、逆の言語構造はありませんでした。 –

+0

これを明示的に行うと、 、それはより読みやすく、 "型安全"です(PHPが型安全にできる程度です...) –

関連する問題