php函数默认参数必须位于参数列表末尾,且只接受常量表达式;传null不触发默认值,类型声明需与默认值匹配。

PHP 函数默认参数必须写在最后
PHP 不允许在有默认值的参数后面,再声明没有默认值的参数。否则会报 Parse error: syntax error, unexpected '='。
- 错误写法:
function foo($a = 1, $b)——$b没默认值但排在有默认值的$a后面,直接解析失败 - 正确顺序:所有带默认值的参数必须靠右,例如
function foo($a, $b = null, $c = []) - 如果想让中间参数可选,只能把前面也设为可选,或改用
...$args+ 手动解析
默认值不能是变量或函数调用
PHP 默认参数只接受常量表达式,比如字面量、NULL、数组字面量、类常量(self::CONST),不能是变量、new、time() 或任何运行时计算结果。
- 合法:
function bar($msg = 'hello', $opts = []) - 非法:
function bar($ts = time())→ 报错Constant expression contains invalid operations - 替代方案:在函数体内判断
if ($ts === null) { $ts = time(); }
传 null 不等于没传,会影响默认值生效
PHP 的“未传参”和“显式传 null”是两回事。默认值只在参数完全缺失时触发;一旦你写了 foo(null),null 就是实参,不会回退到默认值。
- 定义:
function greet($name = 'guest') { return "Hi, $name"; } -
greet()→"Hi, guest" -
greet(null)→"Hi, "(因为$name被赋了null,不是没传) - 需要区分时,建议用
func_num_args()或func_get_args()判断是否真没传
类型声明 + 默认值要小心兼容性
PHP 7.1+ 支持在类型声明后写默认值,但注意:标量类型(string, int 等)默认值必须匹配该类型,且 null 只能在声明为 ?string 这类可空类型时才合法。
立即学习“PHP免费学习笔记(深入)”;
- 合法:
function logMsg(string $msg = '', ?int $code = null) - 非法:
function logMsg(string $msg = null)→ 类型不匹配,报Type mismatch - PHP 8.0+ 开始支持
mixed,但mixed $x = []仍需确保默认值实际能被接受,运行时不会因类型冲突出错
null 就等于没传」,或者在类型声明后随手填了个 null 却忘了加问号。这两个点不盯住,调试时容易绕半天。











