2016-11-01 5 views
2

異なるクラス間でオブジェクトを渡し、複数のクローンではなく1つのインスタンスしか持たないときに問題が発生しています。複数のネストされたクラス間でオブジェクトを渡す

TLDRバージョン:

私はCは作成時にパラメータとしてBの方法によりAを渡されるオブジェクトA->B->Cを、持っている場合は、C->A->Bそれを作成したオリジナルのBにアクセスし、またはそのBのコピーだろうか? Bのコピーがシステムメモリにいくつありますか?

もう少し詳細なバージョン:

のは、私は、サーバーベースの要求を処理するための(おそらく過度に複雑な)ネストされたクラス構造を持っているとしましょう。最初のステップはクラスSessionのオブジェクトをインスタンス化し、その中にHandlerのオブジェクト$handlerを作成することです。しかし、$handler$sessionの内部属性にアクセスする必要があります($userまたは$databaseのようにその目的をはっきりさせる必要があります)。

class Session { 
public $handler; 

public function __construct() { 
    $this->handler = new Handler($this); 

    //DO STUFF HERE 
} 
} 

Handlerクラスは次のようにセッションを継承します。

class Handler { 
private $session; 

public function __construct(Session $inherited_session) { 
    $this->session = $inherited_session; 
} 
} 

サイドノート:$sessionがラインダウン無限ループの少しでもチャンスを避けるためにprivateに設定されている、の0品種。

PHPはオブジェクトを参照渡しするので、このHandler内の$this->sessionオブジェクトは、元のセッションと同じオブジェクトにアクセスする必要がありますか?それ自身のコピーではありませんか?

しかし、ここに私の問題があります。クラスDashboardHandlerクラス内に第3レベルのネストされたオブジェクトを作成し、元の$sessionをそれに渡したいとします(それは気にしないで、Handlerオブジェクト自体)。オフに私達は行くので、私たちはHandlerクラス内でこのどこかに置く:

$dashboard = new Dashboard($this->session); 

DashboardコンストラクタはHandlerがやったとまったく同じ方法でセッションを継承します。

class Dashboard { 
private $session; 

public function __construct(Session $inherited_session) { 
    $this->session = $inherited_session; 
} 
} 

しかし、それはいないようです呼び出されたHandlerのインスタンスにアクセスできるようになりました。今では、$session$handlerの複数のコピーが浮かんでいるようです。なぜなら、それは私が参照について理解しているすべてのものと矛盾しているからです。ここで

は、この病理学的行動の例だ - 私たちはHandlerで変数を持っていると言う:

public $temp_var; 

Handlerのコンストラクタに値を代入していること:

$this->temp_var = '123'; 

し、我々からそれにアクセスしてみてくださいDashboardクラス内では$this->session->handler->temp_varとなります。それはNULLを返します。どうして? $dashboardは、初期化時に$sessionのコピーを継承しましたが、これは呼び出すために初期化された->handlerを持っていませんでしたか?どうすれば各クラスのオブジェクトが1つだけ(ユニーク)なので、$handlerの内部(パブリック)変数を更新すると正しく$dashboard->session->handlerに渡されますか?または、私はちょうど明白な/ばかげたミスをどこかにして完全に見ていないのですか?

注#1:$sessionに設定されている変数は$this->varであるため、正しくアクセスするには$dashboard->session->varから正しくアクセスできるため、ダブルレベルネストは期待通りに機能します。そうでないトリプルレベルのものです。

ノート#2:私はすでに、単に$sessionとともにそのネストされたオブジェクトのすべてのにパラメータとして$handlerを渡すのでは思っている(と解決策が存在しない場合、これは私がしなければならないだろうものです)が、元の$handlerのネストされたオブジェクト内の何らかの形で不可解な違いがあります。

ああ、これをすべて読んだことのある人に感謝します!

+1

TLであることを確認するには、Sessionやプライバシーを変更した

Here's an example;作成したとして、DRは...しかし...だけのように多くのオブジェクトがあります。 'new'は新しいオブジェクトを作成し、' clone'はオブジェクトをコピーします。あなたのオブジェクトを '複製 'しない限り、あなたは常にそれの唯一のインスタンスへの参照を取得します。 – deceze

+0

エラーはあなたのコードのどこかにあります。PHPに明示的に伝えることなく、オブジェクトは複製もコピーもされません。 – Mjh

+0

ええ、これも私の考えですが、文字通り、今朝、コードのエラーを探して仕事に4時間を費やしました。絶対に何も見つからなかったので、ここでこの質問をしてみると、実際には絶望の行為です。 – ak186

答えて

0

私が理解する限り、あなたはinheritanceではなくcompositionを扱っています。だから、

、あなたは(プライベート変数の参照を維持する)は、組成物を通じてセッションを「知っている」の両方HandlerHandlerDashboardに渡されSessionを持っています。

この種の循環参照が必要な理由はわかりませんが、HandlerからDashboardにアクセスするには、Handlerにそれを渡すのはなぜですか?

ローカルスコープの変数にハンドラを格納しているようにそれに加えて、それはの概念的な点から(私は離れてPHPからの最後の2年間でしたが、...しました)

class Session { 

    public function __construct() { 
    // isnt $this->handler = new Handler($this) ?? 
    $handler = new Handler($this); 
    } 
} 

に見えますビュー、そこに "入れ子"、参照のみ、だから私は "3つのレベル"とは何も関係ないとは思わない。

希望すると助かります!私はちょうど$セッションがまだ同じ

+0

残念ながら、上の別のコメントで述べたように、それはちょうど私がここで適切にそれをコピーしていないだけです。$ handlerは実際にはSessionクラスのpublic変数です。もちろん$ this-> handler = new Handler($ this); 私は間違ってそれをコピーしたことに気づいたでしょう、謝罪します。 – ak186

+0

あなたがリンクで見ることができるように、それは動作します、あなたの参照を破った何か他のことをやっているかもしれません – sminutoli

+0

私はあなたの問題はあなたが '$ this-> session-> handler-> temp_var'はすぐに使えるので、いつでもデバッグする必要があります...しかし、やはり再帰が多いので、オブジェクトの設計にもっと時間を費やす必要があるようです – sminutoli

関連する問題