zoukankan      html  css  js  c++  java
  • 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收留的。

  • 相关阅读:
    CPU
    CentOS7 Tomcat 环境部署
    CentOS7 NTP 安装配置
    CISCO VLAN ACL
    ESXI6.0启用 snmp
    编译安装 varnish-4.1.2和yum 安装 varnish-4.0.3
    CentOS7 安装中文帮助手册
    CentOS7 学习笔记
    CentOS7 编译安装 nginx-1.10.0
    CentOS7 cacti 安装
  • 原文地址:https://www.cnblogs.com/zdz8207/p/php-clone-object-serialize.html
Copyright © 2011-2022 走看看