四、对象复制

在 PHP 开发中经常会遇到, 对象复制问题. 通过下面代码深入理解一下, PHP 的对象复制.

class Student
{
    public $username = 'zZ爱吃菜';
    public $age = 29;
    public $weight = 72;

    public $obj = null;
}

$a = new Student();
$b = $a;
$b->age = 18;
var_dump($a->age);
// 输出结果: int(18)

是不是很奇怪, 明明修改了 $b->age 结果 $a->age 值也变成 18 了.

PHP 变量复制的方式有两种: 浅拷贝深拷贝

  • 浅拷贝: 省内存
  • 深拷贝: 消耗内存,但变量相对独立,不会因为状态变化,不好维护.

所以不同场景要活用 深拷贝与浅拷贝.

在 PHP 中,对象类型的复制是浅拷贝的.其他普通类型复制是深拷贝.

1. 浅拷贝(地址传递)

解释: 变量赋值时, 只是传递了当前对象存储的内存地址,即 2个或多个对象指向的是同一个内存地址.(对象只有一个).

所以上面代码就说的同了 $a 和 $b 指向的是同一个内存地址,其中存储的是 Student 的实例, 当 $b->age = 18; 时, 也会影响到 $a 对应的值啦.

对象赋值进行深拷贝

clone 关键字, 可以实现将 对象复制的浅拷贝变为深拷贝

class Student
{
    public $username = 'zZ爱吃菜';
    public $age = 29;
    public $weight = 72;

    public $obj = null;
}

$a = new Student();
$b = clone $a;
$b->age = 18;
var_dump($a->age);
// 输出结果: int(29)

2. 深拷贝(值传递)

解释: 变量赋值, 开辟一个内存空间,重新复制一个值,赋值给新的变量.

Last Updated: 8/8/2019, 5:42:58 PM