PHP引用返回时用括号包裹返回变量为何无效?实测存疑
关于PHP引用返回中括号的问题
嘿,这个问题其实挺容易让人困惑的,我来给你拆解清楚:
首先明确官方文档的核心规则
当通过引用返回时,绝不要用括号包裹返回变量,这不会生效。仅能通过引用返回变量,而非语句结果,使用
return ($a);返回的是表达式($a)的值而非变量。
为什么你的代码看起来“能运行”?
你写的return ($a)里,括号只是用来做表达式分组的,($a)本质上就是对变量$a的求值,所以PHP会把它当成“值返回”,而非引用返回。但因为它的值和变量$a当前的值一致,所以看起来像是“正常运行”,但实际上你根本没拿到变量的引用。
举个测试例子就能看出明显差异:
// 带括号的情况 function &one($param1) { static $a; // 用static让变量在函数结束后保留 $a = $param1 * 2; return ($a); } $ref = &one(5); $ref = 100; // 尝试通过引用修改变量 echo one(5); // 输出10,说明变量没被修改——根本没拿到引用 // 不带括号的情况 function &two($param1) { static $a; $a = $param1 * 2; return $a; } $ref2 = &two(5); $ref2 = 100; echo two(5); // 输出100,说明成功拿到了引用并修改
另外还要注意一个坑:如果你的函数里$a是普通局部变量(不是static),即使你不带括号返回引用,函数执行完毕后局部变量就会被销毁,引用会变成“悬空引用”,后续操作可能会出现不可预期的问题,这也是引用返回时要注意的点。
总结一下
- 带括号的
return ($a)确实不会返回引用,只是返回变量当前的值,看起来能运行但不符合引用返回的预期 - 只有
return $a这种直接返回变量的写法,才能真正返回引用 - 引用返回的变量最好是静态变量、全局变量或者类属性,避免局部变量销毁导致的悬空引用
内容的提问来源于stack exchange,提问作者user9582261
相关产品推荐
相关产品推荐

