PHP克隆对象

时间:2018-11-15 15:13:52  来源:igfitidea点击:

在本教程中,我们将学习如何使用浅复制复制对象,以及使用PHP clone object进行深复制。

让我们开始创建一个简单的Person类来进行演示:

class Person{
    private $sn;
    private $firstName;
    private $lastName;

    public function __construct($sn,$firstName,$lastName){
        $this->sn = $sn;
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    public function __destruct(){
        echo sprintf("编号# %s 的对象已注销.",
            $this->sn);
    }

    public function __toString(){
        return sprintf("编号: %s, 名称: %s, %s",
            $this->sn,
            $this->lastName,
            $this->firstName);
    }
}

现在,我们可以创建一些Person对象:

$p1 = new Person('1234567', 'Alice', 'road');
echo $p1;
 
$p2 = new Person('3456789','the','itroad');
echo $p2;

我们创建了两个对象:$p1和$p2。$p1和$p2都是指向不同person对象的引用。

如果我们按照下面这样做会发生什么?

$p2 = $p1;

$p1和$p2都指向同一个对象。然而,$p2的析构函数被调用了,因为$p2指向的对象已经不再被使用或在作用域之外了。

同时我们可以看到的,当我们将$p1分配给$p2时,并没有创建真正的对象,只是修改了引用。我们复制对象的方式被称为浅拷贝。

为了执行深度复制,从而创建一个新对象,我们可以使用clone操作符,如下所示:

$p2 = clone $p1;

当我们执行该语句时,$p2引用指向新创建的对象。另外,在执行过程中,将自动调用__clone()魔术方法。

我们可以把__clone()魔术方法添加到Person类来查看它是如何工作的。

public function __clone(){
 echo '复制对象 <br>';
}