php函数参数默认值须从右向左连续定义,支持字面量、null、常量;数组键用??安全取默认值;类属性默认值仅限静态表达式;$_post/$_get建议用??或array_merge()兜底。

PHP函数参数里怎么设默认值
PHP函数参数支持直接赋默认值,但必须从右往左连续定义,否则会报 Parse error: default argument follows non-default argument。
- 合法写法:
function foo($a, $b = 'default', $c = null) { } - 非法写法:
function foo($a = 'x', $b, $c = 'y') { }——$b没默认值却跟在有默认值的$a后面 - 默认值可以是字面量、
null、常量(如PHP_VERSION_ID),但不能是函数调用或变量(如date('Y')或$x) - PHP 8.0+ 支持联合类型 + 默认值,比如
function bar(string|int $x = 'fallback') { },但注意null不属于string|int,除非显式写成string|int|null
数组键不存在时怎么安全取默认值
直接访问未定义数组键会触发 Notice: Undefined index。别靠 @ 抑制错误,该用语言原生机制。
- PHP 7+ 推荐用空合并操作符:
$name = $user['name'] ?? 'anonymous'—— 只在$user['name']为null或未定义时生效 - 注意:
$user['name'] ?: 'anonymous'是“逻辑或”,如果$user['name']是0、false、''也会触发,默认值就错了 - 嵌套键推荐用
??链式写法:$city = $user['address']['city'] ?? 'unknown',但 PHP 7.4+ 才支持这种写法;7.3 及更早需拆成两步或用isset() - 如果要兼容老版本且逻辑复杂,封装一个辅助函数比满屏
isset()更可控
类属性怎么设默认值
类属性声明时只能用静态表达式设默认值,运行时逻辑(比如 new 对象、函数调用)不被允许。
- 允许:
public $count = 0;、private $flag = true;、protected $data = []; - 禁止:
public $now = time();(报错)、public $logger = new Logger();(语法错误) - 想初始化对象或动态值?得在
__construct()里做:$this->logger = new Logger(); - PHP 8.1+ 支持只读属性(
readonly),默认值一旦设了就不能改,但规则同上:只接受静态表达式
$_POST / $_GET 参数没传时怎么兜底
用户不提交字段是常态,不能假设 $_POST['email'] 一定存在,也不能依赖 error_reporting(0) 掩耳盗铃。
立即学习“PHP免费学习笔记(深入)”;
- 最简方案仍是
$_POST['email'] ?? '',但要注意空字符串和缺失是两回事;如果业务上“空”和“没传”都要处理,就得用isset($_POST['email']) - 批量处理建议用
array_merge()补全默认项:$input = array_merge(['limit' => 20, 'offset' => 0], $_GET);,但注意它会覆盖所有同名键,包括0、false这类“假值” - 别用
extract($_POST)加默认值——变量污染风险高,现代 PHP 项目基本弃用 - 框架里通常有 Request 对象封装(如 Laravel 的
$request->input('name', 'guest')),但底层逻辑还是基于??或isset()判断
默认值看着简单,但 PHP 里真正容易出问题的是“你以为它没传,其实它传了个空字符串或 0”,或者“你用了新语法,结果部署环境 PHP 版本不够”。动手前先确认目标环境版本,比写十行容错代码都管用。











