php 傳值與傳引用的理解(通俗易懂)

Super樂發表於2020-12-30
php 中遍歷一個array時可以使用for或foreach,foreach的語法為:foreach ($arr as $k => $v)。遍歷陣列,把index賦給$k,陣列的值賦給$v,那麼此處的賦值是傳值還是傳引用呢。先看下面的例子
$arr = array(
    array('id' => 1, 'name' => '張三'),
    array('id' => 2, 'name' => '李四'),
);

foreach ($arr as $obj) {
    $obj['id'] = $obj['id'];
    $obj['name'] = $obj['name'] . '-字尾';
}
print_r($arr);
列印結果如下:
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 張三
        )

    [1] => Array
        (
            [id] => 2
            [name] => 李四
        )

)
觀察可以發現在foreach迴圈中對$arr操作並沒有影響到$arr的元素,所以這裡的賦值是傳值而不是傳引用。那如果需要修改$arr中元素的值該怎麼辦呢?可以在變數前面加一個”&”符號,例如:
foreach ($arr as &$obj) {
    $obj['id'] = $obj['id'];
    $obj['name'] = $obj['name'] . '-字尾';
}
print_r($arr);
列印結果如下:
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 張三-字尾
        )

    [1] => Array
        (
            [id] => 2
            [name] => 李四-字尾
        )

)

下面在講解一些,陣列中是object的情況

$arr = array(
    (object)array('id' => 1, 'name' => '張三'),
    (object)array('id' => 2, 'name' => '李四'),
);

foreach ($arr as $obj) {
    $obj->name = $obj->name  . '-字尾';
}
print_r($arr);
列印結果如下:
Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => 張三-字尾
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => 李四-字尾
        )

)

此時可以看到原始陣列中的object物件已經修改了,所以這裡的賦值又是傳引用而不是傳值

綜合上述,得出的結論:如果陣列裡面存放的是普通型別的元素就是採用傳值的方式,存放物件型別元素採用的方式為傳地址

相關文章