类的拷贝

php对象的拷贝有三种常用的方式: 先定义一个Dog类。

    class Dog{

       public $name;

       public $age;

    }
            $dog=new Dog();
            $dog2=$dog;  //   直接复制拷贝
            $dog2=&$dog;  //引用赋值拷贝
            $dog2= clone  $dog;  //克隆拷贝

首先讲解第一种方式的原理:直接复制拷贝
先来看看下面一段测试代码:

$dog ->name="大黄";
$dog->age=2;
 
$dog2=$dog;  //直接赋值
 
var_dump($dog,$dog2);  //查看一下对象标识符
 
 
echo $dog2->name.'<br/>';//此时还是输出  "大黄"
 
$dog->name="小黑";//注意  $dog改变名字了
 
echo $dog2->name.'<br/>';// 此时输出$dog2的name变成了 "小黑"

此标标识符称为对象标识符。大家可以看出两者 $dog 和 $dog2 的对象标识符是一样的。
在这里插入图片描述
直接赋值的这种拷贝只是 拷贝 对象标识符的一个副本而已,但是对象标识符的数据指向并没有改变,都是指向同一块数据块。 所以就有了$dog->name="小黑"的时候输出$dog2->name变成小黑的原因所在! 并且大家在var_dump();函数的帮助下也看到了,确实两者的对象标识符是一样的!
其次讲解第二种拷贝方式: 赋值引用
还是先看一下测试代码:

$dog = new Dog();

$dog ->name="大黄";
$dog->age=2;
 
$dog2=&$dog;  //  引用赋值拷贝
 
var_dump($dog,$dog2);  //查看一下对象标识符
 
$dog2="abc";
 
echo $dog->name.'<br/>'; //直接报错!   此时的$dog已经是字符串了   不再是对象
 
echo $dog2.'<br/>';//输出  "abc"

输出的结果:
在这里插入图片描述
引用标识符都是一致的,但是$dog2改变了他们的共同指向,使对象标识符变成了字符串"abc",那么此时此标识符不再是对象标识符,而是一个字符串,则echo $dog->name就会报错,echo\ $dog2就会输出 “abc”;
在这里插入图片描述
最后讲一下第三种拷贝方式: 使用 关键字 clone 进行拷贝
先看测试代码:

$dog = new Dog();
 
$dog ->name="大黄";
$dog->age=2;
 
$dog2=clone $dog;  //  克隆拷贝
 
var_dump($dog,$dog2);  //查看一下对象标识符
 
echo $dog->name.'<br/>';
 
$dog->name="小黑";
 
echo $dog->name.'<br/>';
 
echo $dog2->name.'<br/>';

 输出结果:    

在这里插入图片描述
最明显的改变是:两者的对象标识符是不同的,这就意味着指向的数据块也是不同的,此时输出$dog->name以及改变$dog->name都不会影响$dog2的数据。
在这里插入图片描述
文献:https://blog.youkuaiyun.com/xyz_dream/article/details/64440278

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值