物件陣列與一般陣列的區別

馬九南發表於2021-03-11

一般陣列,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 協議》,轉載必須註明作者和本文連結
只不過是一粒塵埃罷了

相關文章