php函数默认参数必须位于参数列表末尾且右连续,仅支持常量表达式,默认值不能用于引用参数,可变参数需置于最后,动态默认值需在函数体内处理。

PHP 函数默认参数必须写在参数列表末尾
PHP 不允许跳过中间参数传值,所以默认参数只能从右往左连续定义。一旦某个参数设了默认值,它右边所有参数都必须有默认值(或根本不存在)。
-
function foo($a, $b = 10, $c = 20)✅ 合法 -
function bar($a = 5, $b, $c = 15)❌ 致命错误:Cannot declare optional argument after required argument - 调用时不能写
foo(1, , 30)—— PHP 不支持“跳位”传参,这种写法直接语法错误
默认参数值只能是常量表达式
PHP 编译时就要确定默认值,运行时变量、函数调用、new 实例等动态内容都不行。
- 允许:
$b = null、$s = 'hello'、$n = 42、$arr = []、$flag = true - 禁止:
$now = time()、$cfg = config('db')、$obj = new DateTime()、$x = $someVar - 如果真需要动态默认值,得在函数体内判断:
if ($param === null) { $param = someFunction(); }
引用参数不能设默认值
PHP 明确禁止对引用参数(&$var)设置默认值,这是语法限制,不是警告。
- ❌ 错误写法:
function bad(&$data = [])→ 解析失败,报错:Default value for parameters with a class type hint can only be NULL(即使没类型提示也会报错) - ✅ 正确做法:去掉引用,或改用返回新值、或用数组/对象内部修改来模拟
- 注意:类型声明(如
array $data = [])和引用(&$data)本身就不能共存,加了引用就自动失去类型检查的上下文
可变参数 + 默认值的组合要小心顺序
当用 ...$args 接收剩余参数时,它必须放在最后,且不能和普通默认参数混排逻辑。
立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确:
function foo($a, $b = 10, ...$rest)——$rest是纯兜底,不参与默认值机制 - ⚠️ 容易误解:
$rest里不会自动填充你省略的默认参数;比如调用foo(1),$b是10,但$rest是空数组,不会把$b的默认值塞进去 - 如果想让
...$args包含显式传入的值,又想保留默认逻辑,建议统一用数组参数:function foo($options = []),再在内部做array_merge(['b' => 10], $options)
optional argument after required 或 Cannot assign by reference to overloaded object,基本就能定位到是哪条规则被碰到了。










