PHP写时复制, 变量复制和对象复制不同!!!
2016年3月18日 15:09:28 星期五
一直以为PHP对象也是写时复制.......
其实:
PHP的变量是写时复制, 对象是引用的
写时复制: $a = $b; 如果$b的内容不改变, $a和$b指向同一块内存; 如果$b内容改变了, $a的内容是不会改变的, 而是为$b重新申请空间存放数据
但是!!!对象 $objTest1 = $objTest2; 这样写, 如果$objTest1或者$objTest2任何一个变了都会影响到对方
测试代码如下
<?php
echo '<pre>';
//////变量复制测试
$a = 123;
$b = $a;
$b = 234; var_dump($a, $b); //int(123) int(234)
//////对象复制测试
Class Test
{
public $t = 123;
public $tt = 234;
} $objTest1 = new Test();
$objTest2 = $objTest1;
$objTest2->t = 'objTest2';
var_dump($objTest1->t, $objTest2->t); // string(objTest2), sting(objTest2) $objTest3 = new Test(); //重新new, 而不是赋值
$objTest3->tt = 'objTest3';
var_dump($objTest1->tt, $objTest3->tt); // int(234), sting(objTest3)
解决办法就是, 使用的时候重新new 或者在类里边实现__clone()方法
另外: 放在数组里的对象也是全程引用的
PHP写时复制, 变量复制和对象复制不同!!!的更多相关文章
- 写时复制和fork,vfork,clone
		写时复制 原理: 用了“引用计数”,会有一个变量用于保存引用的数量.当第一个类构造时,string的构造函数会根据传入的参数从堆上分配内存,当有其它类需要这块内存时,这个计数为自动累加,当有类析构时, ... 
- SpringBoot 如何进行对象复制,老鸟们都这么玩的!
		大家好,我是飘渺. 今天带来SpringBoot老鸟系列的第四篇,来聊聊在日常开发中如何优雅的实现对象复制. 首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层M ... 
- c++中的对象复制
		(1)this指针 this是一个隐含于每个类的成员函数的特殊指针,该指针是一个指向正在被某个成员函数操作的对象的指针. 当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,也就是说,当 ... 
- 深拷贝&浅拷贝&引用计数&写时拷贝
		(1).浅拷贝: class String { public: String(const char* str="") :_str(]) { strcpy(_str,str); } ... 
- php 内核变量 引用计数器写时复制
		写时复制,是一个解决内存复用的方法,就是你在php语言层,如$d=$c=$b=$a='value';把$a赋给另一个或多个变量,这时这个变量都只占用一个内存块,当其中一个变量值改变时,才会开辟另一个内 ... 
- php变量 写时改变 写时复制
		写时复制 $var = 1; $var2 = $var; #此时$var2 与 $var 指向同一个zval refcount = 2: $var = 2; # 此时$val 改变 所以 $var 与 ... 
- COW写时复制
		body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ... 
- phpCOW机制(写时复制)
		写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改. COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C ... 
- php  垃圾回收机制----写时复制和引用计数
		PHP使用引用计数和写时复制来管理内存.写时复制保证了变量间复制值不浪费内存,引用计数保证了当变量不再需要时,将内存释放给操作系统. 要理解PHP内存管理,首先要理解一个概念----符号表. 符号表的 ... 
随机推荐
- jquery报错Uncaught ReferenceError: $ is not defined
- C语言之strrchr函数
			from:http://blog.csdn.net/hgj125073/article/details/8443912 [FROM MSDN && 百科] 原型:char *strrc ... 
- git如何撤销合并
			撒销一个合并 如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态: $ git reset --hard HEAD 或者你已经把合并后的代码提交,但还是想把 ... 
- Linux服务器管理: 系统的进程管理终止进程kill命令
			在Linux中如何用kill终止进程: kill -l [root@localhost~]#kill -l 可以看到kill中有很多的 常用: -1 是重启一个进程 -9 是强制杀死进程 ... 
- jQuery.Callbacks 源码解读二
			一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ... 
- edwin报警和监控平台开源了(python源码)
			简单介绍一下edwin edwin是一个报警和监控平台, 可以使用它监控任意东西, 如有异常(分为警告级和严重级), 可以发出报警. 可以自定义报警的通知方式, 比如邮件/短信/电话. 另外, 它提供 ... 
- HDOJ 4751 Divide Groups
			染色判断二分图+补图 比赛的时候题意居然是反的,看了半天样例都看不懂 .... Divide Groups Time Limit: 2000/1000 MS (Java/Others) Memo ... 
- 【bzoj2060】[Usaco2010 Nov]Visiting Cows拜访奶牛
			题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统 ... 
- LESS介绍及其与Sass的差异
			自从一个月前我偶然发现LESS之后我就开始坚定的使用它了.CSS本身对我来说从来不是问题,但是我很好奇使用变量来沿着一个调色盘为我的网站或模板创建一些东西的想法.拥有一个提供固定数量选项可选的色盘可以 ... 
- [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能
			感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ... 
