如何在PHP 5.3中引用克隆对象中的父对象属性?

时间:2011-09-22 02:34:08

标签: php oop object php-5.3

我想这样做:

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>

2 个答案:

答案 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”!