php 對象數組/傳遞數組參數


在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 }

 


免責聲明!

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



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