0

これは少し混乱を招くように聞こえるかもしれません。それが、おそらく何か間違ったことをしているので、ここにいる理由です。以下のコード例のロジックに従って、「共有プロパティ」を作成して、B を拡張するすべてのクラスが A のプロパティを変更できるようにし、クラス C がそれにアクセスできるようにします。

class A
{
    public $shared = null;
}

class B
{
    public $a;
    public $c;

    function __construct()
    {
        $this->a = new A();
        $this->c = new C($this->a->shared);
    }
}

class C
{
    public $test;

    function __construct(&$shared)
    {
        $this->test = &$shared;

        var_dump($this->test);
    }
}

class Test extends B
{
    $this->a->shared = 'success';
}

ロジックは機能しているようですが、私の悲観論が始まっています。これを正しく参照渡ししていますか、それとも参照渡しなしで目的を達成するためのより良い方法はありますか?

4

3 に答える 3

1

オブジェクトは本質的に PHP >= 5.0 では参照によって渡されるため、参照によって渡す必要はまったくありません。の同じインスタンスが使用されている限りA、 の同じ値sharedも使用されます。

つまり、特定のメンバー変数ではなく、「A」への参照を渡すだけです。

もちろん、コードで行っているように、参照を直接操作することもできます。Test現時点でのクラスの構文の誤りにもかかわらず、あなたのコンセプトは正しいです。Test次のようにクラスを変更した場合(および実行した場合):

class Test extends B {
    public function __construct() {
        parent::__construct(); 
        $this->a->shared = 'success';
    }
}

var_dump(new Test);

次の出力が得られます。

null // <-- from the first var_dump in C::__construct()

object(Test)[1]
  public 'a' => 
    object(A)[2]
      public 'shared' => &string 'success' (length=7)
  public 'c' => 
    object(C)[3]
      public 'test' => &string 'success' (length=7)

もっと簡単な例です:

class a { public $f; }
class b { public $f; }

$a = new a;
$b = new b;

$a->f = 1;
$b->f = &$a->f;

$a->f = 2;

var_dump($a, $b);

生産する

object(a)[1]
  public 'f' => &int 2
object(b)[2]
  public 'f' => &int 2

そして、必要なだけ何度でもそれを行うことができます。うまくいけば、これは非常に貧弱なサンプルです。

于 2013-05-21T20:20:59.567 に答える
0

現在のコードA::$sharedでは、何も指していません。に渡すと null になりますC。したがって、実際にはオブジェクトへの参照ではなく、への参照を渡してnullいます。

最初に共有オブジェクトを作成すると、それを渡すことができます。

$shared = new stdClass();

$a = new stdClass();
$b = new stdClass();
$a->shared = $shared;
$b->shared = $shared;

$shared->foo = "bar";
var_dump($a->shared->foo); // "bar"
$b->shared->foo = "baz";
var_dump($a->shared->foo); // "baz"    
于 2013-05-21T20:24:10.163 に答える