按值传递
函数范围内对值的任何改变在函数外部都会被忽略,值传递是把值拷贝一份,两个变量指向两个内存地址。$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视频教程