PHP 8.4 尚未发布,当前只能为 Laravel 项目做兼容准备;需先升级至 Laravel 10(PHP 8.1+),等待 Laravel 11(2025 年 3 月)正式支持,并修复动态属性、static 返回类型等 PHP 8.4 预期报错问题。

PHP 8.4 尚未发布(截至 2024 年 10 月,最新稳定版是 PHP 8.3),php8.4 目前不存在正式版本,因此「迁移 Laravel 项目到 PHP 8.4」属于提前规划或误传。实际能做的,是为 Laravel 应用**做好兼容 PHP 8.4 的准备**,并确保当前升级路径(如从 PHP 8.1 → 8.2 → 8.3)不埋下未来阻塞点。
确认你当前的 PHP 和 Laravel 版本是否支持向 PHP 8.4 过渡
Laravel 官方对 PHP 版本的支持有明确生命周期约束。Laravel 10.x 要求 PHP ≥ 8.1,但 不保证兼容尚未发布的 PHP 8.4;Laravel 11(预计 2025 年 3 月发布)才会正式声明对 PHP 8.4 的支持。
-
php -v和composer show laravel/framework必须先明确当前组合 - Laravel 9.x 已于 2023 年 8 月结束安全更新,不能直接跳到 PHP 8.4
- 若仍在用 Laravel 8.x 或更早,必须先升级到 Laravel 10.x(PHP 8.1+),再等 Laravel 11
- PHP 8.4 的 RFC 列表(如
static返回类型强化、#[\Override]属性、弃用动态属性)已可查,但实现细节可能在 RC 阶段调整
检查 Laravel 项目中易被 PHP 8.4 破坏的代码模式
PHP 8.4 明确计划强化类型系统和限制隐式行为,以下模式在 PHP 8.3 已触发 E_DEPRECATED,PHP 8.4 很可能升级为 E_ERROR:
- 使用动态属性(
$obj->undefined_prop = 1),除非类声明了__set()或启用了#[\AllowDynamicProperties] - 函数返回类型声明为
static但实际返回子类实例(PHP 8.4 要求严格匹配声明类) - 在
match表达式中遗漏default分支且无穷尽枚举(PHP 8.4 可能要求显式覆盖所有情况) - 调用已被标记为
@deprecated的 Laravel 内部方法(如Illuminate\Support\Str::slug()的旧参数顺序)
建议立即运行:
立即学习“PHP免费学习笔记(深入)”;
vendor/bin/phpstan analyse --level=8 app/
并添加以下配置到 phpstan.neon 启用 PHP 8.4 兼容性检查(需 phpstan-php84 扩展):
parameters:
level: 8
checkForUninitializedProperties: true
phpVersion: '8.4'Composer 依赖与扩展兼容性必须人工验证
很多包不会主动声明 "php": "^8.4"(因版本未发布),但可能已在 dev-main 分支适配。关键动作:
- 运行
composer update --dry-run查看是否有包因php版本约束失败 - 检查常用扩展是否支持:如
ext-mongodb、ext-swoole、ext-pcntl—— 它们通常滞后于 PHP 主版本 - 特别注意
doctrine/dbal:Laravel 10 默认用 v3,而 v3.7+ 才开始实验性支持 PHP 8.4 的新类型语法 - 自定义 Artisan 命令中若用了反射(
ReflectionMethod::getAttributes()),需确认是否依赖 PHP 8.4 新增的#[\SkipAttribute]行为
测试套件必须覆盖 PHP 8.4 预期变更点
PHPUnit 当前(v10.5)尚未原生支持 PHP 8.4,但可通过 php-nightly + composer require --dev phpunit/phpunit:dev-main 提前验证。重点关注:
- 测试中是否依赖
assertObjectHasAttribute()(PHP 8.4 动态属性禁用后该断言失效) - 数据库迁移是否含
->nullable(false)这类非法组合(PHP 8.4 对类型推导更严,可能暴露 Schema 构建时的逻辑错误) - 队列任务中若用了
serialize()+ 自定义__wakeup(),需确认是否触发 PHP 8.4 新增的反序列化安全限制
CI 配置示例(GitHub Actions):
jobs:
php84-check:
runs-on: ubuntu-latest
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: 'nightly'
- run: composer install --no-progress
- run: vendor/bin/phpunit --exclude-group legacy真正要动手“迁移到 PHP 8.4”,得等官方发布首个 GA 版本,并同步确认 Laravel 11 的 laravel/framework 版本号(如 v11.0.0)已将 "php": "^8.4" 写入 composer.json。在此之前,所有所谓“升级”都是预演——重点不是改代码,而是堵住 PHP 8.3 已警告、PHP 8.4 必报错的缺口。











