PHP写时复制, 变量复制和对象复制不同!!!-阿里云开发者社区

开发者社区> mydcool> 正文

PHP写时复制, 变量复制和对象复制不同!!!

简介: 2016年3月18日 15:09:28 星期五 一直以为PHP对象也是写时复制....... 其实:  PHP的变量是写时复制, 对象是引用的 写时复制: $a = $b; 如果$b的内容不改变, $a和$b指向同一块内存; 如果$b内容改变了, $a的内容是不会改变的, 而是为$b重新申请...
+关注继续查看

2016年3月18日 15:09:28 星期五

一直以为PHP对象也是写时复制.......

其实: 

PHP的变量是写时复制, 对象是引用的

写时复制: $a = $b; 如果$b的内容不改变, $a和$b指向同一块内存; 如果$b内容改变了, $a的内容是不会改变的, 而是为$b重新申请空间存放数据

但是!!!对象 $objTest1 = $objTest2; 这样写, 如果$objTest1或者$objTest2任何一个变了都会影响到对方

测试代码如下

 1 <?php
 2 echo '<pre>';
 3 //////变量复制测试
 4 $a = 123;
 5 $b = $a;
 6 $b = 234;
 7 
 8 var_dump($a, $b); //int(123) int(234)
 9 //////对象复制测试
10 Class Test
11 {
12     public $t = 123;
13     public $tt = 234;
14 }
15 
16 $objTest1 = new Test();
17 $objTest2 = $objTest1;
18 $objTest2->t = 'objTest2';
19 var_dump($objTest1->t, $objTest2->t); // string(objTest2), sting(objTest2)
20 
21 $objTest3 = new Test(); //重新new, 而不是赋值
22 $objTest3->tt = 'objTest3';
23 var_dump($objTest1->tt, $objTest3->tt); // int(234), sting(objTest3)

解决办法就是, 使用的时候重新new 或者在类里边实现__clone()方法

 

另外: 放在数组里的对象也是全程引用的

 

Finger PHP 框架

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ThinkPHP中实例化对象M()和D()的区别,select和find的区别
原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。
884 0
Java基础-07.总结private,this,封装,static,成员方法变量,局部变量匿名对象
1:成员变量和局部变量的区别(理解)(1)在类中的位置不同成员变量:类中方法外局部变量:方法定义中或者方法声明上(2)在内存中的位置不同 成员变量:在堆中局部变量:在栈中(3)生命周期不同(成员的创建与销毁时间)成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,随着方法的调用完毕而消失(4)初始化值不同成员变量:有默认值局部变量:没有默认值,必须定义,赋值
1360 0
变量 - PHP手册笔记
原文:变量 - PHP手册笔记 基础 PHP中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的,并且出现中文可能也是合法的。 变量默认总是传值赋值。PHP也提供了另外一种方式给变量赋值:引用赋值。
880 0
类与对象 - PHP手册笔记
原文:类与对象 - PHP手册笔记 基本概念 PHP对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝。 当创建新对象时,该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。
785 0
+关注
mydcool
php相关专家
287
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载