这可能听起来有点令人困惑,这就是为什么我在这里,因为我可能做错了什么。按照下面的示例代码的逻辑,我正在尝试创建一个“共享属性”,以便任何扩展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';
}
这种逻辑似乎有效,但我的悲观情绪正在恶化。我是否通过引用正确地传递了这个,或者是否有更好的方法来实现我所追求的而不通过引用?
答案 0 :(得分: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
你可以根据需要多次这样做。希望以更好的方式,这是一个非常糟糕的样本。
答案 1 :(得分: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"
答案 2 :(得分:-1)
为什么不将B扩展为A,或者在B内部具有A的属性? 此外,静态变量可能对您有所帮助。如果你不熟悉他们,请问Goog。