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收留的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM