PHP 8.2+ 函数定义必须显式声明返回类型、严格遵循参数顺序(默认值参数须在末尾)、确保函数已加载且命名规范,否则调用时直接抛出 Fatal error。
定义函数在 PHP 8.2+ 中已不是“写完就能跑”的简单事——类型声明不匹配、参数顺序错乱、
类型与实际返回值冲突,三者任一都可能让脚本在调用瞬间抛出
。别指望它只报 Warning。
PHP 8.2+ 函数定义必须显式声明返回类型
PHP 7 允许
这种无返回类型的写法,PHP 8.2 默认开启严格模式后,若调用时传入
或字符串,就可能因隐式转换失败而崩溃。
实际开发中,尤其涉及数据库查询或 API 响应的函数,必须提前预判空值场景:
返回整数但可能为
?写成
,而非
返回数组但有时是
(如
失败)?用
,不能省略
绝对不能加返回类型——PHP 8.2 会直接报
没返回值?明确写
,否则漏掉
语句会导致类型校验失败
参数类型和默认值顺序不能颠倒
PHP 不允许把带默认值的参数放在必填参数前面,比如
是非法的,运行时报
。
更隐蔽的问题是:类型声明 + 默认值组合下,
是否被接受取决于是否启用
:
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
未声明 strict_types:传
给
参数,会被静默转为空字符串
启用 strict_types:同上操作直接触发
想安全接收
?改用
,且确保调用时不传非
非字符串值
调用函数前务必确认定义已加载
PHP 不像 JS 那样有函数提升(hoisting),
在同一作用域里会报
。
常见踩坑点:
条件定义函数(如
)——上线后
直接不可用
函数定义在
的文件里,但该文件因路径错误或权限问题没加载成功
使用
加载含函数定义的文件,但文件内有语法错误,导致加载失败且无提示
函数名大小写混用:
和
在 Linux 下是两个函数,调用错一个就报未定义
可变参数和命名参数要区分使用场景
(可变参数)适合封装日志、调试工具等不确定参数个数的函数;命名参数(PHP 8.0+)则适合配置类函数,比如
。
但两者不能混用随意:
用了命名参数,就必须保证所有参数名拼写准确,错一个字母就是
可变参数必须是最后一个参数:
合法,
非法
命名参数无法跳过中间参数:
可以,但不能只写
而跳过前两个
判断是否收到可变参数,别用
——它在
语法下行为不稳定,改用
函数体里写
很容易,但真正难的是在调用那一行之前,就清楚知道这个函数在当前 PHP 版本下会返回什么、会不会抛异常、有没有被加载——这些都不是运行时才暴露的问题,而是定义和组织方式决定的。
functionreturnFatal error: Uncaught TypeErrorfunction sum($a, $b) { return $a + $b; }nullnullfunction getId(): ?intintfalsejson_decode()array|falsefalse__construct()Parse errorvoidreturnfunction log($level = 'info', $msg)Parse error: default argument follows non-default argumentnulldeclare(strict_types=1)nullstring $s = ''TypeErrornull?string $s = nullnullfoo(); function foo() {}Fatal error: Uncaught Error: Call to undefined functionif (ENV === 'dev') { function debug() { ... } }debug()requireinclude_onceMyFunc()myfunc()...imagecreatefrompng(path: '/a.png', cache: true)Uncaught Error: Unknown named parameterfunction batch($mode, ...$ids)function batch(...$ids, $mode)connect(host: '127.0.0.1', port: 3306)connect(database: 'test')func_num_args()...count($ids) > 0return