按值傳遞
函數範圍內對值的任何改變在函數外部都會被忽略,值傳遞是把值拷貝一份,兩個變數指向兩個記憶體位址。
$a = 6; $b = $a; // 这是值传递,把 $a 的值拷贝给了 $b,在内存中 $a 和 $b 不在一个地址中,更改任意变量的值对对方无影响 $b = 7; echo $a; // 输出:6 function foo($b){ echo ++$b; } foo($b); // 输出:8 echo $b; // 输出:7 说明函数内的改变对函数外的值没有影响,因为,当 $b 传入函数内的时候是值传递, 会把值在内存中拷贝一份存入一个新的内存地址中
按引用傳遞
函數範圍內對值的任何改變在函數外部也能反映出這些修改,引用傳遞是將一個變數的記憶體位址標識傳給了內外一個變量,兩個變數最終指向記憶體同一個位址。
$a = 6; $b = &$a; $b = 7; echo $a; // 输出:7 function foo(&$c){ echo ++$c; } foo($b); // 输出:8 echo $b; // 输出:8 说明函数内的改变对函数外的值有影响,因为,当 $b 传入函数内的时候是引用传递, 函数体内的$b和外部的$b实际上是指向同一个内存地址,所以一个改变,另外一个变量的值也会改变
function func(&$arr){ $arr['a'] = []; $arr = &$arr['a']; $arr['b'] = '333'; var_dump($arr); } $arr = [ 'a' => '111', 'b' => '222' ]; func($arr); var_dump($arr); /** # 第一个输出: array(1) { ["b"]=> string(3) "333" } # 第二个输出: array(2) { ["a"]=> array(1) { ["b"]=> string(3) "333" } ["b"]=> string(3) "222" } */
上面的範例明明還是引用傳遞進去的為啥會兩個 $arr 印出不一樣的結果呢?
因為裡面有一步操作 $arr = &$arr['a']; 這一步驟之後函數內的 $arr 的指向位址已經改變,指向了$arr['a'],所以兩次列印的結果不一樣。
注意:php 中對於物件預設引用傳值一般引用傳值用在需要在函數體內改變傳入參數並且需要影響外部變數的時候使用,其他時候一般使用值傳遞。
推薦教學:PHP影片教學
#以上是php引用傳遞和值傳遞的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!