PHP函数默认参数必须从右往左定义,且只能位于参数列表末尾;默认值须为常量或字面量,不可用动态表达式;可变参数(...$args)必须置于最右且后无默认参数;PHP 8.0+命名参数要求被跳过的参数必须有默认值。

PHP函数默认参数必须从右往左定义
PHP不支持跳过中间参数传值,所以默认参数只能放在参数列表末尾。一旦某个参数设了默认值,它右边所有参数都必须有默认值,否则会报 Parse error: syntax error, unexpected '='。
- ✅ 正确:
function foo($a, $b = 'default', $c = null) { } - ❌ 错误:
function foo($a = 'bad', $b, $c = 'ok') { }——$b没默认值但左边有,默认值断层 - ⚠️ 注意:PHP 8.0+ 允许
null作为类型声明的默认值,但$b = null和string|null $b = null是两回事,后者更安全
默认值不能是动态表达式,只能是常量或字面量
PHP解析函数签名时默认值就得确定下来,所以不能写 time()、new DateTime() 或变量,否则直接报 Parse error: syntax error, unexpected 'time'。
- ✅ 允许:
$timeout = 30、$debug = false、$sep = ','、$config = [] - ❌ 禁止:
$now = time()、$path = __DIR__ . '/conf.php'、$log = $this->logger - ? 替代方案:把动态逻辑放进函数体,用
isset()或func_num_args()判断是否传参,或者用null占位再做初始化
可变参数(...$args)和默认参数能共存,但顺序不能乱
...$args 必须放在参数列表最右边,且不能有任何默认参数跟在它后面——否则语法直接失败。
- ✅ 正确:
function log($level = 'info', ...$messages) { } - ❌ 错误:
function log(...$messages, $format = 'text') { }——...$args后不能接任何参数 - ⚠️ 注意:
...$args本身不参与“默认值规则”,但它左侧的具名参数仍需遵守从右往左设默认值的约束
PHP 8.0+ 支持命名参数,但默认值影响调用自由度
命名参数允许跳过中间参数,但前提是那些被跳过的参数**必须有默认值**,否则调用时会报 Uncaught Error: Too few arguments。
立即学习“PHP免费学习笔记(深入)”;
- ✅ 可以这样调:
foo(a: 1, c: 3),前提是$b有默认值 - ❌ 如果
$b没默认值,哪怕你写了foo(a: 1, c: 3),PHP 仍认为$b缺失 - ? 小心陷阱:类型声明 + 默认值为
null时,记得加联合类型,比如string|null $b = null,否则null会触发类型错误











