• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

php对象数组/传递数组参数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php正则匹配URL发布时间:2022-07-10
下一篇:
深思PHP数组遍历的差异(array_diff的实现)发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap