① 命名参数必须全部写在位置参数之后;② 同一参数名在一次调用中只能出现一次;③ 启用命名语法后不可混用位置传参(如 func(name: 'a', 2) 致命报错)。

整理PHP 8.0命名参数笔记,要聚焦实际编码中高频出错点和易被忽略的语法规则,避免堆砌概念、照抄手册,确保翻看时能快速定位问题根源。
先筛出真正该记的核心规则
只记录三条不可绕过的硬约束:① 【命名参数必须全部写在位置参数之后】;② 【同一参数名在一次调用中只能出现一次】;③ 所有参数一旦启用命名语法,就不能再混用位置传参(比如 func(1, name: 'a') 合法,但 func(name: 'a', 2) 直接报错)。
其余如“支持默认值”“提升可读性”这类描述性内容,不写进笔记——它们是结果,不是操作依据。
按错误类型归档典型反例
把调试时真实踩过的坑原样记下来,带上下文和报错信息:
立即学习“PHP免费学习笔记(深入)”;
❌ 错误写法:createUser('Alice', active: false)
PHP Fatal error: Named argument cannot be used after positional argument
✅ 正确写法:createUser(name: 'Alice', active: false) 或 createUser('Alice', true, null, false)(全位置)
⚠️ 注意:这个报错不是警告,是致命错误,【服务会直接中断】,不能靠测试环境侥幸放过。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
对比表格只保留两列:场景 + 你该敲的代码
删掉所有“说明”“优点”“背景”列,表格只用于速查:
| 场景 | 你该写的代码 |
|---|---|
| 跳过第3个可选参数,设置第4个 | sendMail(to: 'a@b.com', subject: 'Hi', sendAt: time() + 3600) |
| 构造函数里只改一个配置项 | new HttpClient(timeout: 5000) |
| 调用内置函数(如 date) | date('Y-m-d') // 不支持命名参数,强行写 date(format: 'Y-m-d') 会报错 |
用真实函数定义反向推导调用逻辑
第一步:找一个你项目里正在用的多参数函数,比如:
function buildQuery(array $params, string $base = '', bool $encode = true, int $depth = 5): string { ... }
第二步:在笔记里手写三组调用,覆盖不同模式:
① 全命名(最安全):buildQuery(params: $_GET, encode: false)
② 混合写法(禁止!):buildQuery($_GET, encode: false) → 这行会炸
③ 必填参数用位置,其余全命名:buildQuery($_GET, base: '/api', depth: 3) → 合法,因为 $_GET 是唯一必填项,它在最前
最后补一条执行前必检项
每次写完命名参数调用,光标停在括号末尾时,默念一遍:【前面有没有位置参数?有没有重复参数名?有没有对内置函数乱用?】 —— 念完再按回车。


















