PHP怎样传递函数参数_PHP参数传递方式【引用】
PHP函数参数默认按值传递,引用传递需在函数定义时参数前加&,调用时加&已废弃。引用适用就地更新、批量修改数组、避免大数组复制。对象默认句柄传递,替换对象才需引用。默认参数与引用混用有限制,建议优先使用返回值。
先说个基本规则:PHP 的函数参数,默认是按值传递的。什么意思呢?就是你在函数里面改参数,外面那个变量纹丝不动。真要实现对调用方变量的修改,就必须显式使用引用传递——在函数定义的参数前加上 & 符号。注意,这不是可选项,是强制语法要求;漏掉这个 &,哪怕你心里想着“我要改原变量”,最终也只会作用于副本。

为什么 & 必须写在函数定义里,而不是调用时
背后的原因是,PHP 的引用绑定发生在函数声明阶段,而不是调用阶段。也就是说,你在调用时加 &(比如 myfunc(&$x))——这个做法在 PHP 5.3 以上就已经被废弃了,PHP 7.4 开始更是直接报 Deprecated: Call-time pass-by-reference 错误。
- 正确写法:在函数定义时声明引用的意图:
function update(&$val) { $val .= '!'; } - 错误写法:定义为
function update($val)但调用时写update(&$x) - 另外有个关键点:调用时传入的必须是变量,不能是字面量或表达式。
update($a)没问题,但update(123)或update($a + 1)会直接触发Fatal error: Only variables can be passed by reference
& 引用传递的实际适用场景
问题来了:是不是所有想让函数“顺手”改外面变量的情况,都适合用引用?其实不然。真正需要用引用的,是那些函数职责本身就包含“就地更新”,而且调用方也依赖这种副作用的场景。
- 批量修改数组元素,比如
function normalizeKeys(&$arr)直接重键名 - 解析配置并填充多个输出变量,如
parseIni($file, &$sections, &$errors) - 避免大数组复制开销(尤其在 PHP 7.0 前,ZVAL 复制成本相当高)
- 有一个容易混淆的点:对象本身在 PHP 5+ 中默认就是“句柄传递”,
$obj参数即使不加&,也能在函数内修改其属性;只有当你需要替换整个对象引用(比如$obj = new OtherClass())时才需要&$obj
容易踩的坑:默认参数 + 引用混用
有一点值得特别注意:PHP 允许给引用参数设默认值,但限制很严格——默认值只能是 null 或常量表达式,别想着用变量、函数调用或数组字面量。
- 合法写法:
function logError(&$msg = null, $level = 'warning') - 非法写法:
function bad(&$data = getData())→Parse error: default argument is invalid - 还有一个更容易踩的坑:如果函数同时有默认参数和引用参数,引用参数不能放在默认参数之后,否则调用时会产生位置歧义。举个例子,
function foo($a, &$b = null)是错的;必须写成function foo(&$b = null, $a)或者全部非默认参数在前
引用传递看着简单,但它的影响是全局的——一旦函数内部意外改了 $var,所有持有该变量的地方都会感知到。与其依赖引用“悄悄改”,不如多数时候选择返回新值、让调用方自己决定是否赋值,这样逻辑更透明、更容易维护。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















