Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

php浅复制(php深浅拷贝)

作者:′残花败落°   发布日期:2025-05-26   浏览:453

在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类有三个属性:nameageaddressaddress属性是一个Address对象。Address类有两个属性:citycountry

首先,我们创建了一个Person对象person1,并将其属性值设置为"John"、30和一个Address对象。然后,我们使用clone关键字复制了person1,得到了一个新的Person对象person2

接下来,我们修改了person2的属性值,并输出了person1person2的属性值。在浅复制的情况下,person1person2address属性引用的是同一个Address对象,所以当我们修改person2->address->city时,person1->address->city也会被修改。而在深复制的情况下,person1person2address属性引用的是两个不同的Address对象,所以它们的city属性可以独立修改。

总结来说,浅复制只复制了对象的引用,而深复制复制了对象本身及其引用的对象。在实际开发中,根据需求选择合适的复制方式非常重要。

上一篇:dede 调用php文件

下一篇:php如何查询日期(php日期格式)

大家都在看

php session用法

phpisset函数

php后端

php爬虫框架

php读取csv文件

php 三元表达式

php文件加密

php 拆分字符串

php pcntl

php ||

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站