php对象复制、clone、浅复制与深复制实例详解
php对象复制、clone、浅复制与深复制实例详解
一、用clone(克隆)来复制对象
$obj1 = new Object();
$obj2 = clone $obj1;
clone方法会触发对象里定义的__clone魔术方法
clone操作有一个非常大的缺陷:使用clone操作复制对象时,当被复制的对象有对其它对象的引用的时候,引用的对象将不会被复制。
注:mysql返回的对象数组没有__clone方法的,用不了clone方法。报错:Message: __clone method called on non-object
二、利用串行化做深复制
PHP有串行化(serialize)和反串行化(unserialize)函数,只需要用serialize()将一个对象写入一个流,然后从流中读回对象,那么对象就被复制了。在JAVA语言里面,这个过程叫做“冷藏”和“解冻”。
$obj1 = new Object();
$obj2 = unserialize(serialize($obj1));//序列化然后反序列化
使用此方案时无法触发__clone魔术方法来完成一些附加操作,但会触发被复制对象和所有被引用对象的__sleep和__wakeup魔术方法。
$tmp = unserialize(serialize($datalist));
$omit = $tmp[0]->{$mtype};
用序列化的方法
====================
没添加前输出:
array(1) { [0]=> object(stdClass)#22 (1) { ["number"]=> string(11) "20190524049" } }
添加后输出:
array(1) { [0]=> object(stdClass)#22 (2) { ["number"]=> string(11) "20190524049" ["m54"]=> int(1) } }
-------------
$tmp = new ArrayObject($datalist);
$omit = $tmp[0]->{$mtype};
用这个new ArrayObject()
-------------
$tmp = array_merge(array(), $datalist);
$omit = $tmp[0]->{$mtype};
用合并到一个空数组里
-------------
$tmp = array();
foreach ($datalist as $key => $v) {
$tmp[$key] = clone $v;
}
$omit = $tmp[0]->{$mtype};
=================
php object(stdclass)转数组的函数
经常调用一个借口之后 返回的内容是json串,利用php函数json_decode() 解析json串之后得到的 数据类型为object(stdclass)
这是一个对象,要取其中的内容也可以 取得,利用object->属性 可以取得,但是习惯数组处理数据,下面是一个object(stdclass)转成 数组的函数。
function object_array($array){
if(is_object($array)){
$array = (array)$array;
}
if(is_array($array)){
foreach($array as $key=>$value){
$array[$key] = object_array($value);
}
}
return $array;
}
json_decode()想要解析返回结果为数组,需要加上第二个参数TRUE
stdclass 是zend的一个预留类,它是一个空类,没什么内容,php所有的类都继承了这个类,也就是说它是所有类的父类。
当PHP中一个类没有明确父类时,成为一个孤儿类时,会被stdclass收留的。
php对象复制、clone、浅复制与深复制实例详解的更多相关文章
- iOS 浅赋值、深复制、全然复制的知识点梳理验证(附加归档解档)
写于前: 在之前转载的一片文章中.文中对浅复制和深复制进行了具体的解读,同一时候还提到了深复制(one-level-deep copy).全然复制(true copy)的概念,并指出iOS开发中的深复 ...
- Java中JSON字符串与java对象的互换实例详解
这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...
- Java中JSON字符串与java对象的互换实例详解(转)
http://www.jb51.net/article/90914.htm 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要 ...
- 浅谈python深复制与浅复制区别
话不多说,看代码
- 对象克隆(clone)实例详解
<?php class Staff { public $name; public $age; public $salary; public function __construct($name, ...
- PHP类和对象函数实例详解
1. interface_exists.class_exists.method_exists和property_exists: 顾名思义,从以上几个函数的命名便可以猜出几分他们的功能.我想这也是我随着 ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- (转)Java中JSON字符串与java对象的互换实例详解
在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...
- php:对象(object)数据类型实例详解
什么是对象? 对象是存储数据和有关如何处理数据的信息的数据类型.是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位.一个对象由一组属性和对这组属性进行操作的一组服务组成. 语法 在 PHP ...
随机推荐
- SSRS 报表开发过程中,除数为0的处理
这里仅供记录,方法并非原创 在SSRS报表开发过程中,我们经常会遇到除数为0的计算 一般来说,我们都是通过IIF来进行处理,比如: =IIF(B=0,0,A/B) 但实际效果,则是,如果B=0的时候, ...
- php 的定界符 <<<eof
PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特 ...
- react.js父子组件通信
这里通过todolist的功能来说明 父组件: import React,{ Component,Fragment } from 'react'; import TodoItem from './To ...
- eclipse C++ 配置自动提示
转:http://www.cnblogs.com/myitm/archive/2010/12/17/1909194.html 定位到:Windows→Preferences→Java→Editor→C ...
- easyui入门
什么是easyui! easyui=jquery+html4(用来做后台的管理界面) 1.通过layout布局 我们先把该导的包导下 然后就是JSP页面布局 2.通过tree加载菜单 先来一个实体类 ...
- Node.js—概述
一.Node.js与其他语言对比 Node.js不是一种独立的语言,与PHP.JSP.Python.Perl.Ruby的"既是语言,也是平台"不同,Node.js的使用Java ...
- 201871010113-刘兴瑞《面向对象程序设计(java)》第六-七周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...
- oracle并行模式
参考链接:oracle并行模式(Parallel),深入理解Oracle的并行操作(原创),oracle使用并行踩过的坑 1. 语法(这个可以加到insert.delete.update.select ...
- 鲜贝7.3--Xshell安装
安装包百度云下载地址:https://blog.csdn.net/yueruitao/article/details/85263968 具体方法请参考: https://blog.csdn.net/q ...
- 剑指Offer-16.合并两个排序的链表(C++/Java)
题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 可以用一个新的节点,来去比较两个单调递增的链表当前节点的值,如果p1当前的值小于p2,则新 ...