php函数默认按值传递,修改参数不影响外部变量;需用&声明引用参数、global或$globals访问全局变量,或use(&$var)捕获闭包变量,但return更安全清晰。

函数内直接赋值改不了外部变量
PHP 默认按值传递,函数里对参数的修改不会影响调用处的原始变量。这不是 bug,是语言设计——除非你明确告诉 PHP “我要改外面那个”。
常见错误现象:$name = "Alice"; function change($name) { $name = "Bob"; } change($name); echo $name; // 还是 "Alice"
- 使用
&符号声明引用参数:function change(&$name) { $name = "Bob"; } - 只对变量有效,不能对字面量或表达式加引用(
change(&"hello")会报Fatal error: Cannot pass parameter 1 by reference) - PHP 7.4+ 对
foreach中的变量默认按引用处理需格外小心,foreach ($arr as &$v)后不unset($v)可能导致意外覆盖
return 比引用更安全、更易读
多数场景下,靠 return 返回新值比用引用修改原变量更清晰,也避免副作用。尤其在函数职责单一、逻辑不复杂时。
使用场景:字符串处理、数组过滤、配置合并等纯计算型操作
立即学习“PHP免费学习笔记(深入)”;
-
function uppercase($str) { return strtoupper($str); }—— 调用方决定是否覆盖:$s = uppercase($s); - 引用参数会让函数“有状态”,测试和复用变难;
return则天然无副作用 - 性能差异几乎可忽略,别为省一次赋值去换可读性
全局变量用 global 或 $GLOBALS 都得谨慎
想在函数里改全局变量?可以,但这是信号:设计可能已偏离单一职责。PHP 不阻止,但其他开发者读到 global $config 会本能停顿两秒。
错误现象:function init() { global $db; $db = new PDO(...); } —— 看似方便,实际让依赖关系隐式化
- 用
global $var前必须确保变量已在全局作用域定义,否则静默失败(Notice: Undefined variable可能被关闭) -
$GLOBALS['var'] = ...更显式,但一样绕过作用域约束,调试时容易漏掉赋值点 - 现代写法倾向传参 + return,或封装进类,把“共享状态”显式管理起来
闭包 use 引用捕获变量要留心生命周期
匿名函数用 use (&$var) 确实能改外部变量,但变量生命周期比闭包长时,行为可能出人意料。
典型陷阱:$counter = 0; $inc = function() use (&$counter) { return ++$counter; }; unset($counter); echo $inc(); // Notice: Undefined variable
-
use (&$var)是绑定变量本身,不是值;unset($var)后再调用闭包会触发 notice - 如果变量是对象,
use ($obj)默认传对象引用(PHP 对象天然引用语义),不用加& - 多层嵌套闭包 + 引用捕获时,debugger 可能显示变量值“滞后”,建议优先用返回值组合逻辑











