php函数参数默认值须在参数列表右侧定义,仅支持常量表达式,类型声明需匹配(如?string $name = null),多默认值须连续置于末尾,继承时不可修改父类默认值。

PHP 函数参数默认值直接在定义时用 = 赋值即可,但必须遵守位置、类型和表达式限制,否则会报错或行为异常。
语法写法:直接赋值,位置要靠右
在函数声明的参数列表中,给参数名后加 = 默认值:
function sendEmail($to, $subject = "通知", $body = "") { ... }
- 有默认值的参数必须放在所有无默认值参数的右侧。例如 function example($a, $b = 1, $c = "ok") 合法;function example($a = 1, $b) 会报 Parse error。
- 多个默认参数可以连续写,只要它们都在末尾。
允许的默认值类型:必须是常量表达式
默认值只能是编译期可确定的常量,不能是变量、函数调用或对象实例化:
- ✅ 允许:"hello"、123、null、[](PHP 5.6+)、[1,2]、true
- ❌ 禁止:date("Y")、$_SERVER['HTTP_HOST']、new DateTime()、$config['timeout']
类型声明与默认值配合要点
带类型声明时,需注意 null 的语义和兼容性:
- 若参数声明为 string $name = null,会报错 —— 因为 null 不属于 string 类型。
- 正确写法是使用可空类型:?string $name = null,此时未传参或传 null 都合法。
- 但要注意:?string $name = null 中的 = null 实际上是冗余的,因为 ?string 已隐含允许 null;显式写出仅用于强调意图,不改变运行逻辑。
实际使用建议
让默认值真正提升可用性,而不是埋下隐患:
- 配置类函数优先用数组默认值:function connect($host, $options = ['port' => 3306, 'timeout' => 5])
- 想区分“未传参”和“传了 null”?PHP 本身不支持这种区分,需改用其他方式(如封装成对象或额外布尔标记)。
- 继承时子类不能修改父类方法参数的默认值,否则 PHP 8+ 会触发致命错误。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











