在PHP中,浅复制是指创建一个新对象,该对象的属性值与原对象相同,但是属性值引用的对象仍然是原对象中的引用。换句话说,浅复制只复制了对象的引用,而不是对象本身。
深复制是指创建一个新对象,该对象的属性值与原对象相同,但是属性值引用的对象也会被复制,而不是引用原对象中的对象。
在PHP中,可以使用clone
关键字来实现对象的浅复制。当使用clone
关键字复制一个对象时,会调用对象的__clone()
方法(如果存在),该方法可以在复制对象之前对属性进行处理。
下面是一个示例代码,演示了浅复制和深复制的区别:
class Person {
public $name;
public $age;
public $address;
public function __construct($name, $age, $address) {
$this->name = $name;
$this->age = $age;
$this->address = $address;
}
public function __clone() {
$this->address = clone $this->address;
}
}
class Address {
public $city;
public $country;
public function __construct($city, $country) {
$this->city = $city;
$this->country = $country;
}
}
// 创建一个Person对象
$address = new Address("New York", "USA");
$person1 = new Person("John", 30, $address);
// 浅复制Person对象
$person2 = clone $person1;
// 修改person2的属性值
$person2->name = "Mike";
$person2->address->city = "Los Angeles";
// 输出person1和person2的属性值
echo $person1->name; // 输出 "John"
echo $person1->address->city; // 输出 "Los Angeles"
echo $person2->name; // 输出 "Mike"
echo $person2->address->city; // 输出 "Los Angeles"
// 创建一个Person对象
$address = new Address("New York", "USA");
$person1 = new Person("John", 30, $address);
// 深复制Person对象
$person2 = clone $person1;
// 修改person2的属性值
$person2->name = "Mike";
$person2->address->city = "Los Angeles";
// 输出person1和person2的属性值
echo $person1->name; // 输出 "John"
echo $person1->address->city; // 输出 "New York"
echo $person2->name; // 输出 "Mike"
echo $person2->address->city; // 输出 "Los Angeles"
在上面的示例中,我们创建了一个Person
类和一个Address
类。Person
类有三个属性:name
、age
和address
,address
属性是一个Address
对象。Address
类有两个属性:city
和country
。
首先,我们创建了一个Person
对象person1
,并将其属性值设置为"John"、30和一个Address
对象。然后,我们使用clone
关键字复制了person1
,得到了一个新的Person
对象person2
。
接下来,我们修改了person2
的属性值,并输出了person1
和person2
的属性值。在浅复制的情况下,person1
和person2
的address
属性引用的是同一个Address
对象,所以当我们修改person2->address->city
时,person1->address->city
也会被修改。而在深复制的情况下,person1
和person2
的address
属性引用的是两个不同的Address
对象,所以它们的city
属性可以独立修改。
总结来说,浅复制只复制了对象的引用,而深复制复制了对象本身及其引用的对象。在实际开发中,根据需求选择合适的复制方式非常重要。
上一篇:dede 调用php文件
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站