在对象之间共享属性


Sharing a property between objects

这可能听起来有点令人困惑,这就是为什么我在这里,因为我可能做错了什么。按照下面示例代码的逻辑,我试图创建一个"共享属性",以便任何扩展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';
}
逻辑似乎行得通,但我的悲观情绪开始起作用了。我是否正确地通过引用传递这个,或者是否有更好的方法来实现我所追求的而不通过引用传递?

根本不需要通过引用传递,因为在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

你可以做很多次,只要你需要。这是一个非常糟糕的示例

在当前代码中,A::$shared没有指向任何东西。当你把它传递给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"    

为什么不让B扩展A,或者在B内部拥有A的属性呢?此外,静态变量可能会对您有所帮助。如果你对它们不熟悉,可以问google。