PHP 8.3 升级需重点检查五项:启用 fileinfo 扩展、规范动态属性声明、修正隐式 nullable 参数、验证框架兼容性(如 Yii 2.0.55+)、确认上传相关 ini 设置未被覆盖。

PHP 8.2 升级到 8.3 不会直接报错崩溃,但不少“能跑”的老代码会在 8.3 下触发弃用警告、类型错误或静默行为变更——尤其当项目依赖框架旧版、自定义反射逻辑、动态属性写法或宽松 MIME 校验时。
下面是你升级前必须核对的五项关键检查点,覆盖高频出问题的场景:
确认 fileinfo 扩展已启用且生效
PHP 8.3 对文件类型校验更严格,多数框架(Laravel、ThinkPHP、Yii)默认用 finfo_open() 做真实内容检测。若扩展未加载:
-
php -m | grep fileinfo无输出 → 检查 php.ini 中extension=fileinfo是否取消注释 - CLI 和 Web(如 PHP-FPM)可能加载不同 php.ini → 分别运行
php --ini和<?php phpinfo(); ?>验证 - Linux 看
/usr/lib/php/8.3/下有无fileinfo.so;Windows 看php/ext/下有无php_fileinfo.dll
检查动态属性使用是否合规
PHP 8.2 已开始弃用动态属性,8.3 默认抛出 Deprecated: Creation of dynamic property 警告,8.4+ 将升级为致命错误:
- 找出所有没声明属性又没实现
__set()的类(如空class Model {}或仅靠构造赋值的 DTO) - 运行测试代码:
$obj = new YourClass(); $obj->fake_prop = 'x'; echo $obj->fake_prop; - 若报弃用警告,需补全
public $fake_prop;,或加#[\AllowDynamicProperties]注解(仅限确需动态字段的类)
验证隐式 nullable 参数写法
PHP 8.4 起将彻底废弃 function f(Foo $x = null) 这类写法,但 8.3 已在部分上下文(如反射调用、DI 容器解析)中发出警告:
- 搜索项目中形如
= null且左侧有类型声明的参数(如string $name = null,array $opts = null) - 改为显式可空类型:
?string $name = null,?array $opts = null - Yii 2.0.51+、Laravel 10+ 已适配,老版本需手动改或升框架
检查框架与 CMS 的实际兼容性composer.json 里 "php": ">=8.2" 只代表 Composer 允许安装,不代表运行稳定:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- Yii 2.0.55 属“继承式兼容”,需实测四项硬指标:类加载(特别是
yii\base\Object是否还存在)、DI 容器对无类型参数的反射行为、错误处理边界、静态分析通过率 - MetInfo V8.1、WordPress 6.7+、Drupal 10.4+ 已明确支持 8.3;老版本需同步升级系统包
- 运行
php artisan --version或wp core version --allow-root确认当前框架最低要求
核对上传与配置相关 ini 设置是否被覆盖
PHP 8.3 默认更保守,面板(宝塔/cPanel)或 Nginx + PHP-FPM 组合常导致上传参数失效:
- 确保
php.ini中明确启用并设值(非注释状态):file_uploads = Onupload_max_filesize = 20Mpost_max_size = 25Mmax_execution_time = 300 - 若用 Nginx,检查站点配置中是否用
fastcgi_param PHP_VALUE覆盖了这些值 - 运行
php -r "echo ini_get('upload_max_filesize');"确认实际生效值
不复杂但容易忽略
立即学习“PHP免费学习笔记(深入)”;


















