我想这样做:
class T
{
public $a;
public $b;
public function __construct()
{
$this->a = new P;
$this->b = clone $this->a;
}
}
class P
{
public $name ="Chandler";
public function __clone()
{
$this->name = & $that->name;
}
}
$tour = new T;
$tour->a->name = "Muriel";
?>
但在此之后,$tour->b->name
将是NULL
,为什么?
如何对父对象name
属性进行克隆name
属性引用,因此当我更改父对象name
时,克隆对象name
会相应更改?< / p>
答案 0 :(得分:1)
来自php.net克隆manual page,
当克隆一个对象时,PHP 5将执行所有的浅层副本 对象的属性。任何引用其他的属性 变量,仍然是参考。
但$name
是标量变量(字符串)而不是对象。因此,当您将$a
克隆到$b
时,$a->name
和$b->name
是不同的变量。 ie)$b->name
未引用$a->name
简而言之,我不相信这是可能的(如果我错了,请纠正我)。但是,你可以作弊并做一些事情:
class P
{
public $name;
public function __construct(){
$this->name = new StdClass();
$this->name->text = 'Chandler';
}
}
然后$a->name->text = 'Muriel';
也会更改$b->name->text
。
答案 1 :(得分:0)
$that
函数中没有如George Schlossnagle所说的那样:高级PHP编程书......它给了我几个星期的头痛......
所以,你可以在构造函数中使用一个简单的技巧(在类__clone
中);使变量引用自己:
P
这适用于PHP 5.3.6。我没有在其他版本中测试它。
因此,当您执行function __construct()
{
$this->name = & $this->name;
}
时,$tour->a->name = "Muriel";
也将成为“Muriel”!