题目
PHP函数参数的值传递与引用传递
信息
- 类型:问答
- 难度:⭐
考点
函数参数传递机制,引用操作符(&)的使用,变量作用域
快速回答
在PHP中:
- 默认采用值传递:函数内修改参数不影响外部变量
- 使用&符号实现引用传递:函数内修改会影响外部变量
- 示例:
function modifyValue(&$param) { $param = 'changed'; }
原理说明
PHP函数参数传递有两种机制:
- 值传递(默认):创建参数的副本传入函数,函数内修改不影响原始变量
- 引用传递:使用&符号传递变量内存地址,函数内修改直接影响原始变量
代码示例
// 值传递示例
function addPrefix($str) {
$str = "PRE_".$str;
return $str;
}
$original = "test";
echo addPrefix($original); // 输出: PRE_test
echo $original; // 输出: test(未改变)
// 引用传递示例
function addPrefixRef(&$str) {
$str = "PRE_".$str;
}
$original = "test";
addPrefixRef($original);
echo $original; // 输出: PRE_test(原始值被修改)最佳实践
- 优先使用值传递,避免意外的副作用
- 仅在需要修改原始变量时使用引用传递(如操作大型数组)
- 函数返回值应通过return语句而非引用参数
常见错误
- 误以为值传递能修改外部变量:
function failChange($x) { $x = 100; } - 在调用时错误使用&:
addPrefixRef(&$var); // PHP5.4+已弃用 - 对字面量使用引用:
addPrefixRef("text"); // 致命错误
扩展知识
- 内存优化:PHP写时复制(Copy-On-Write)机制在值传递时不会立即复制内存
- 对象传递:PHP5+中对象默认通过引用句柄传递(表现类似引用)
- 返回引用:
function &getReference() { return $var; }