首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

php之clone 复制对象以及__clone魔术方法

那是因为(借用php手册的话就是):当对象复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。...qqq $obj1->value1 = "qqq"; //在这里我们使用clone来赋值obj1 $obj2 =clone $obj1; //我们在这里把obj2的的value1复制为eee $obj2...那么我们如果想要把这个值不守clone出来的对象的值影响该怎么办呢? 那么在这里我们只需要在此clone一下这个成员变量就好了,该如何clone了?...那么把我们的成员变量在__clone方法里面clone一下就好了,如下代码演示: 注:clone只能用于对象克隆,对象复制。记住,如果你clone一个非对象变量将会报错no obj。。。...使用clone的时候触发 public function __clone() { $this->obj_data = clone $this->obj_data;//这个对象将会被克隆,会被强制复制

86510

java 通过Object的clone复制对象

java 通过Object的clone复制对象 需求背景 对象的克隆是指创建一个新的对象,且新的对象的状态与原始对象的状态相同。当对克隆的新对象进行修改时,不会影响原始对象的状态。...要想对一个对象进行复制,就需要对clone方法覆盖。...到此为止实现的对象clone方法属于浅复制(shallow copy),那么什么是深复制(deep copy) 深复制 大家都知道,在java语言中,分为基本数据类型和引用数据类型,基本数据类型包括...浅复制clone()内部类似于创建一个新的对象并把对象中相应的字段通过赋值给新的对象,而引用数据类型的内容本身并不是克隆的,因此这种复制就叫浅复制。...到这里基本问题都解决了,但是还可能会遇到一个问题,就是当前对象中有很多引用对象,这样的话通过clone的方法处理起来会比较麻烦,这是可以采用另外一种方式,序列化的方式来实现对象的深复制

6710
您找到你想要的搜索结果了吗?
是的
没有找到

php5对象复制clone、浅复制与深复制实例详解

本文实例讲述了php5对象复制clone、浅复制与深复制。...因此我们的“复制”失败了。看来直接变量赋值的方式并不能拷贝对象,为此 PHP5提供了一个专门用于复制对象的操作,也就是 clone 。这就是对象复制的由来。...用clone(克隆)来复制对象 我们现在使用PHP5的clone语言结构来复制对象,代码如下: PHP代码 $tv1 = new Television(); $tv2 = clone $tv1; echo...由此可见,clone操作有这么一个非常大的缺陷:使用clone操作复制对象时,当被复制对象有对其它对象的引用的时候,引用的对象将不会被复制。...我们使用clone复制对象,这种复制叫做“浅复制”:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象

1.1K50

JS实现clone()方法,对五种主要数据类型进行值复制

,这会抛弃对象的constructor,也就是深复制之后,无论这个对象原本的构造函数是什么,在深复制之后都会变成Object。...另外诸如RegExp对象是无法通过这种方式深复制的。 所以这里我将介绍一种,我自认为很优美的深复制方法,当然可能也存在问题。...()函数是整个方法的核心,对于任意一个非js预定义的对象,都会调用这个函数。...而对于所有js预定义的对象,如Number,Array等,我们就要实现一个辅助clone()函数来实现完整的克隆过程: /* Method of Array*/ Array.prototype.clone...同时我也在开发一个插件,主要的思想也就是扩展预定义对象的方法。 这个插件叫JustJS(Github项目地址) 有以下一些特性:1. 同时支持Web前端和node.js使用。2.

2.9K10

PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析

但是,由于所有对象都被视为引用而不是值,所以现在复制对象更为困难。如果尝试复制一个引用的对象,这只会指向原对象的地址位置。...为了解决复制问题,PHP提供了一种克隆clone(关键字,不是方法)对象的显式方法。..."<br / "; } } $person1 = new Person("张三三", "男", 23); $person2 = clone $person1; //使用clone关键字克隆/复制对象...,创建一个对象的副本 $person3 = $person1; //这不是复制对象,而是为对象复制出一个访问该对象的引用 $person1- say(); //调用原对象中的说话方式,打印原对象中的全部属性值...运行结果: 我的名字:张三三,性别:男,年龄:23 我的名字:李四四,性别:男,年龄:10 3.单例类的加强:禁止克隆 对于一个类的对象,如果使用“clone运算符”,就会复制出一个和当前对象完全一样的新对象出来

37310

覆盖Object中的clone方法, 实现深复制

现在为了要在clone对象时进行深复制, 那么就要Clonable接口,覆盖并实现clone方法,除了调用父类中的clone方法得到新的对象, 还要将该类中的引用变量也clone出来。...() throws CloneNotSupportedException { Body newBody = (Body) super.clone(); newBody.head = (Head...} 打印结果为: body == body1 : false body.head == body1.head : false   由此可见, body和body1内的head引用指向了不同的Head对象..., 也就是说在clone Body对象的同时, 也复制了它所引用的Head对象, 进行了深复制。...但实际上上面代码还不是真正意义上的深复制,可以说是不彻底的深复制。因为在拷贝Head类时,默认执行的是浅复制,也就是说Head中组合的Face对象并不会被复制

1K00

Map复制给新Map时,用 “=、clone、还是putAll”?论Map的深复制和浅复制

使用.clone()方法 测试用例 测试用例源码 使用场景 在我们最初使用map复制开发业务代码时,通常会踩到深浅复制(拷贝)这个坑里,比如我,在Map复制时 (如:Map<String, String...所以当我修改引用类型属性后,new_Map和old_Map的引用变量值都发生变化;(如你的value都是基本类型,就不涉及深浅拷贝的问题) 尝试过的办法 1. “=”赋值 新建一个Map,然后使用“=”直接赋值,这样只是复制了...使用.clone()方法 HashMap自带了一个clone()方法,但是,它的源码中注释说明了也只是一种浅复制(拷贝):(源码如下) @Override public Object clone..., #中间两条,是修改old_map对象的基本数据类型的时候,并没有影响到new_map对象。...(下方提供自定义clone方法源码) #上述的工具类,可以实现对象的深拷贝,不仅限于HashMap,前提是实现了Serlizeable接口。

3.8K31

面向对象之深复制与浅复制

前言: 基于面向对象的思想,大部分的类都可视为“工具”。那么对于工具的使用,我们总是期望能高效而又方便。特别是当我们在重复实现某些功能的时候,那有没有一种能快速复用类的捷径呢?   ...“Copy”----复制。   查看Java中的Object这个祖先类我们可以发现,该类含有一个clone()方法,并且返回“Object”类型。...其实,这就是所谓的“浅复制(shadow copy)”。其大概意思指的是对实现了Cloneable接口的对象进行克隆的时候,值对象可直接复制,而引用对象只是复制其“引用”而已。...具体,可参考下图: 图一:浅复制 思考一下,如何实现“深复制”?即在复制基本类型的同时,还能复制引用类型做指向的对象。 解决方法是这样的,首先得确定引用对象实现了Cloneable接口。...然后,我们重写House类的clone()方法对引用对象同样进行克隆操作。最后将其set回house对象,这样便实现了深复制

58010

JS深浅复制

❝焦虑很多时候就是因为想的太多 ❞ 简明扼要 JS在语言层面「仅支持浅复制」,深复制需要手动实现 instanceof 判断的是 a和A是否有「血缘关系」 扩展运算符在副本中「直接定义新的属性」 Object.assign...浅复制 VS 深复制 针对JS引用类型数据(复杂数据)的复制,有两种处理模式。...❝JS在语言层面「仅支持浅复制」,深复制需要手动实现 ❞ ---- 2. 浅谈浅复制JS中,存在几个内置属性天然支持数据浅复制,但是每个属性都有一定的适用条件和范围。...扩展运算符不能复制内置对象的特殊属性 我们在前面介绍JS数据类型的时候,介绍了在浏览器宿主环境下,JS = ECMAScript + DOM + BOM。...深复制 JS中深复制需要手动实现、 3.1 通过嵌套扩展运算符实现深复制 const original = {name: '789', work: {address: 'BeiJing'}}; const

4.1K20

Java对象复制的方法

方法中调用super.clone()方法得到需要的复制对象。...,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。...简单来说,在浅克隆中,当对象复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。 在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。...原因是浅复制只是复制了addr变量的引用,并没有真正的开辟另一块空间,将值复制后再将引用返回给新对象。 为了达到真正的复制对象,而不是纯粹引用复制。...,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象复制一份给克隆对象

1.4K40
领券