php中函数参数有两种传递方式, 分别是按值传递和引用传递.
函数参数按值传递
按值传递就是把传入的值进行复制操作, 使得参数和传入的值成为两个独立的个体, 函数内对参数的任何操作都不会影响函数外传入的值.
下面是一个按值传递的举例:
<?php
$var = 'a'; //要作为参数的值
function test($param){
$param = 'b'; //对传入的参数重新赋值
}
test($var);//调用函数
echo $var;//测试结果还是a, 说明按值传递没有改变函数外的值
函数参数按引用传递
按引用传递就是把传入值的地址位置
传给函数, 使得参数和传入的值是同一个东西, 函数内对参数的任何操作都会影响函数外传入的值.
下面是一个按引用传递的举例:
<?php
$var = 'a'; //要作为参数的值
function test(&$param){
$param = 'b'; //对传入的参数重新赋值
}
test($var);//调用函数
echo $var;//测试结果是b, 说明按引用传递会改变函数外的值
php中string, boolean, number简单类型作为函数参数, 默认的传递方式
在php中string, boolean, number这三个简单类型, 它们的传递方式是使用值传递, 也就是作为参数后, 函数内对参数的任何操作都不会影响函数外的值.
php中数组作为函数参数时, 默认的传递方式
php中数组作为复杂类型, 它的传递方式还是值传递, 下面是测试:
<?php
$arr= [
'0' => 1
]; //数组初始值是 '0'=>1
function test($param){
$param['0']= 2; //函数内设置了 '0'=>2
}
test($arr); //调用函数
var_dump($arr); //数组的值还是 '0'=>1, 说明是按值传递
php中null作为函数参数时, 默认的传递方式
php中null的传递方式也还是值传递, 下面是测试:
<?php
$null= null; //初始值是null
function test($param){
$param= 'abc';
}
test($null); //调用函数
var_dump($null); //初始值还是null, 说明按值传递
php中对象作为函数参数时, 默认的传递方式
php中对象作为函数参数, 传递方式和以上有所不同, 它是作为引用传递, 下面是测试:
class A{
public $a=1;
}
$obj = new A(); //初始化后对象属性a=1
function test($param){
$param->a = 2; //函数内修改了对象属性a=2
}
test($obj);
var_dump($obj); //对象属性a=2, 说明对象是按引用传递
对于string, boolean, number, null, 数组, 如何按引用传递?
我们只需要在参数前面加上一个地址符号就可以让按值传递的参数转变为按引用传递, 下面是举例:
function (&$param){ //加上一个地址符就变成了引用传值
...
}
总结
大家一定要记住php中对象是引用传递, 而其他数据类型是按值传递, 防止BUG出现.
文章首发于: https://w2fenx.com/309.html