php8.4如何迁移laravel项目到8.4_php8.4框架升级注意事项【汇总】

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

PHP 8.4 尚未发布(截至 2025 年 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 -vcomposer show laravel/framework 必须先明确当前组合
  • Laravel 9.x 已于 2025 年 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() 的旧参数顺序)

建议立即运行:

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-mongodbext-swooleext-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 必报错的缺口。