PHP函数参数默认值必须从右往左连续设置,仅支持字面量、常量、静态表达式,不可用函数调用或变量;引用参数不能设默认值;类型声明下默认值须严格匹配类型。

PHP函数参数怎么写默认值
PHP函数参数默认值必须写在函数定义里,且只能从右往左连续设置——也就是说,如果第3个参数设了默认值,那它右边的所有参数(如果有)也必须设,默认值不能跳着来。
常见错误是给中间参数设默认值却漏掉后面的,比如 function foo($a, $b = 10, $c, $d = 20),这会直接报错 Parse error: default argument follows non-default argument。
- 默认值可以是字面量(
1、"hello"、[])、常量(PHP_VERSION)、静态表达式(time() + 3600),但不能是函数调用(如date('Y-m-d'))或变量(如$default) - PHP 8.0+ 支持
null合并运算符写法:用$param = null配合函数体内$param ??= 'fallback',更灵活些 - 数组参数默认空数组很常用:
function logEvent($msg, array $context = []),避免调用时传null导致警告
为什么不能用函数调用当默认值
PHP 在函数声明阶段就解析默认值,而函数调用(如 get_default_config())属于运行时行为,编译器无法提前执行。所以像 function connect($host = get_host()) 会直接语法报错。
想实现类似效果,得把逻辑挪到函数体内:
立即学习“PHP免费学习笔记(深入)”;
function connect($host = null) {
$host = $host ?? get_host();
// ...
}
- PHP 8.1+ 引入了
new表达式支持(如$logger = new StdLogger()),但仍不支持任意函数调用 - 别试图用
eval()或反射绕过——既危险又违背设计初衷 - 如果依赖外部状态(如配置、环境变量),默认值设为
null,再在函数开头做判断更清晰
引用参数能设默认值吗
不能。带 & 的引用参数(&$arr)不允许设默认值,PHP 会报 Parse error: Default value for parameters with a class type hint can only be NULL(即使没类型提示也会拒绝)。
这是因为引用传递需要真实变量地址,而默认值是临时值,没有内存地址可绑定。
- 如果确实需要“可选引用”,改用普通参数 + 返回值,或传入对象(对象本身就是引用语义)
- 例如:
function modifyArray(array $input): array { return array_merge($input, ['added']); } - 或者用对象封装:
function processConfig(Config $cfg = null) { $cfg ??= new Config(); ... }
类型声明和默认值冲突要注意什么
当参数有类型声明(如 string $name)时,默认值必须匹配该类型,否则会触发致命错误。比如 string $name = null 就不行,除非改成可空类型 ?string $name = null。
常见踩坑点:
-
int $count = '10'❌ 字符串不是整型,哪怕能转换也不行 -
array $data = null❌ 必须写成?array $data = null或array $data = [] -
callable $cb = 'strlen'✅ 字符串函数名是合法的callable值
PHP 7.4+ 的属性类型、PHP 8.0+ 的联合类型(string|int)也都遵循这个规则:默认值必须落在联合类型的至少一个分支里。



















