php 傳值與傳引用的理解(通俗易懂)
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物件已經修改了,所以這裡的賦值又是傳引用而不是傳值
綜合上述,得出的結論:如果陣列裡面存放的是普通型別的元素就是採用傳值的方式,存放物件型別元素採用的方式為傳地址。
相關文章
- 值傳遞與引用傳遞
- 快速搞懂值傳遞與引用傳遞
- php函式的傳值如果需要引用傳遞注意的細節PHP函式
- 值傳遞和引用傳遞
- JavaScript的值傳遞和引用傳遞JavaScript
- Java的值傳遞和引用傳遞Java
- golang工作筆記(二)值傳遞與引用傳遞Golang筆記
- 深入理解PHP中賦值與引用PHP賦值
- JAVA值傳參和引用傳參Java
- Java中的值傳遞和引用傳遞Java
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列
- Java 是傳值還是傳引用 (轉)Java
- PHP中物件的引用傳遞PHP物件
- 這一次,讓你徹底理解Java的值傳遞和引用傳遞!Java
- Java引數傳遞是傳值還是傳引用?Java
- Java - 是值傳遞還是引用傳遞Java
- Day30--值傳遞和引用傳遞
- Python的函式引數傳遞:傳值?引用?Python函式
- 關於值傳遞和引用傳遞的解釋
- GO切片傳值/引用/指標Go指標
- PHP 物件導向 (四)類物件賦值為引用傳遞PHP物件賦值
- js中 函式引數的 傳值/傳引用 問題JS函式
- ES5中的值傳遞/引用傳遞--解釋
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Go語言引數傳遞是傳值還是傳引用Go
- PHP後臺傳值PHP
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- 解惑4:java是值傳遞還是引用傳遞Java
- Python為什麼不是傳值或傳引用? - mathsppPython
- java方法中只有值傳遞,沒有引用傳遞Java
- JS是按值傳遞還是按引用傳遞?JS
- java經典問題:傳值還是傳引用(轉)Java
- Python引數傳遞,既不是傳值也不是傳引用Python
- vue父子傳值與非父子傳值Vue
- C語言的傳值與傳地址C語言
- PHP引用的&理解PHP
- php傳引用和全域性變數PHP變數
- go語言引數傳遞到底是傳值還是傳引用Go