对象数组与一般数组的区别

一般数组,foreach会把值拷贝到循环变量中
对象数组,foreach会把值(对象)的引用拷贝循环变量中,因为是拷贝,所以将会改变原对象的值。

class a
{
    public $a = 10;
    public $b = 11;
    public $c = 12;
}

$instanceA = new a();
$instanceB = new a();

$arr = [$instanceA, $instanceB];
foreach ($arr as $key => $object) {
    $object->a = 100;
}

var_dump($arr);

执行结果:

array(2) {
  [0]=>
  object(a)#1 (3) {
    ["a"]=>
    int(100)
    ["b"]=>
    int(11)
    ["c"]=>
    int(12)
  }
  [1]=>
  object(a)#2 (3) {
    ["a"]=>
    int(100)
    ["b"]=>
    int(11)
    ["c"]=>
    int(12)
  }
}

可以看到属性a的值被修改了。
下面是一般数组的情况:

$arrA = [
    10, 11, 13
];

$arrB = [
    10, 11, 13
];

$arr = [$arrA, $arrB];
foreach ($arr as $key => $object) {
    $object[0] = 100;
}

var_dump($arr);

执行结果:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    int(10)
    [1]=>
    int(11)
    [2]=>
    int(13)
  }
  [1]=>
  array(3) {
    [0]=>
    int(10)
    [1]=>
    int(11)
    [2]=>
    int(13)
  }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
只不过是一粒尘埃罢了
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1
foreach ($arr as $key => &$object) {
    $object[0] = 100;
}

这样写就可以了,具体可以看一下PHP对象赋值和普通变量赋值的区别,也就是深拷贝和浅拷贝的区别

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!