異なるクラス間でオブジェクトを渡し、複数のクローンではなく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
オブジェクトは、元のセッションと同じオブジェクトにアクセスする必要がありますか?それ自身のコピーではありませんか?
しかし、ここに私の問題があります。クラスDashboard
のHandler
クラス内に第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
のネストされたオブジェクト内の何らかの形で不可解な違いがあります。
ああ、これをすべて読んだことのある人に感謝します!
TLであることを確認するには、Sessionやプライバシーを変更した
Here's an example;作成したとして、DRは...しかし...だけのように多くのオブジェクトがあります。 'new'は新しいオブジェクトを作成し、' clone'はオブジェクトをコピーします。あなたのオブジェクトを '複製 'しない限り、あなたは常にそれの唯一のインスタンスへの参照を取得します。 – deceze
エラーはあなたのコードのどこかにあります。PHPに明示的に伝えることなく、オブジェクトは複製もコピーもされません。 – Mjh
ええ、これも私の考えですが、文字通り、今朝、コードのエラーを探して仕事に4時間を費やしました。絶対に何も見つからなかったので、ここでこの質問をしてみると、実際には絶望の行為です。 – ak186