在php當中,普通得數據類型的參數傳遞是通過copy賦值,而object對象則會傳遞對象的引用,在函數的調用或者直接賦值時會按照這個規則進行,而php中array()傳遞屬於普通數據類型(與我們在C/C++中的傳遞數組時是傳遞指針有所不同),因此數組不能夠使用clone將內容復制,而是直接賦值時就會復制整個數組,但是該數組是否會完全把內容復制,還要根據數組的item內容確定:當數組的item是普通數據類型時(數值,數組etc.),會直接整個數組包括內容都被復制;當數組的item是object時,只會復制數組的引用,而指向的object的內容是不會被復制的。因此對象數組需要使用clone對每個item復制方可對整個數組復制。
1 class T { 2 3 public $curarray; // 類數組成員 4 5 function T($value) { 6 $this->curarray = $value; 7 } 8 9 function change($cas) { // 改變數組內容 10 for ($j = 0; $j < 10; $j++) { 11 $this->curarray[$j] = $cas; 12 } 13 } 14 15 function get() { // 返回數組 16 return $this->curarray; 17 } 18 19 } 20 21 class Node { 22 23 public $val; 24 25 function Node($v) { 26 $this->val = $v; 27 } 28 29 } 30 31 function test() { 32 $array1 = []; 33 for ($i = 0; $i < 10; $i++) { 34 array_push($array1, 0); 35 } 36 $obj1 = new T($array1); 37 $obj1->change(2); 38 //$array1的item內容為普通類型,因此傳參時是整個復制傳參,$array1的內容不會改變 39 40 $array2 = []; 41 for ($i = 0; $i < 10; $i++) { 42 array_push($array2, new Node(0)); 43 } 44 $obj2 = new T($array2); 45 $obj2->change(2); 46 // $array2的item內容為object,因此傳遞的相當於一個引用數組,因此對數組內容修改,會導致$array2的內容改變 47 48 $tmpArray = []; 49 foreach ($array2 as $item) { 50 array_push($tmpArray, clone $item); 51 } 52 //采用這種clone的方法才是復制傳入參數,change方法不會影響$array2的內容 53 }