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中没有指向任何内容。当你将它传递给时它是空的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 回答
-1

为什么不让 B 扩展 A,或者无论如何在 B 中拥有 A 的属性?此外,静态变量可能对您有所帮助。如果您不熟悉它们,请询问 Goog。

于 2013-05-21T20:20:08.757 回答