从Laravel 6切回5.5后出现ReflectionParameter::getClass()弃用错误
错误信息
Deprecated: Method ReflectionParameter::getClass() is deprecated in
/private/var/www/finconnect/vendor/laravel/framework/src/Illuminate/Container/Container.php
on line 811
Deprecated: Method ReflectionParameter::getClass() is
deprecated in
/private/var/www/finconnect/vendor/laravel/framework/src/Illuminate/Container/Container.php
on line 885
已尝试操作
- 清除Laravel各类缓存:
php artisan cache:clear php artisan config:clear php artisan view:clear
- 删除vendor目录并重装依赖:
rm -rf vendor/ composer clearcache composer dump-autoload -o
环境说明
当前运行PHP 7.3.33 (cli) (built: Dec 27 2023 06:53:55) ( NTS ),Valet环境检查全部正常:
| 检查项 | 是否正常? |
|---|---|
| Valet是否完全安装? | 是 |
| Valet配置是否有效? | 是 |
| Homebrew是否安装? | 是 |
| DnsMasq是否安装? | 是 |
| DnsMasq是否运行? | 是 |
| DnsMasq是否以root身份运行? | 是 |
| Nginx是否安装? | 是 |
| Nginx是否运行? | 是 |
| Nginx是否以root身份运行? | 是 |
| PHP是否安装? | 是 |
| 关联的PHP(php@7.3)是否运行? | 是 |
| 关联的PHP(php@7.3)是否以root身份运行? | 是 |
| valet.sock是否存在? | 是 |
根据PHP官方文档,ReflectionParameter::getClass()仅在PHP8.0+中被标记为弃用,PHP7.3本不应触发该警告,现求Laravel5.5+PHP7.3环境下的解决思路。
排查解决思路
1. 确认CLI与Web环境PHP版本一致
CLI显示PHP7.3,但Web服务可能实际调用了更高版本的PHP。在Laravel项目中创建临时路由输出phpinfo():
Route::get('/phpinfo', function() { phpinfo(); });
访问该路由检查Web环境的PHP版本,若不一致,调整Valet关联版本:
valet use php@7.3 --force
2. 确保Laravel框架版本完全回退到5.5.x
切换分支后,检查composer.lock中laravel/framework的版本是否为5.5.x。若存在版本残留,执行:
composer require laravel/framework:5.5.* --no-update composer update laravel/framework --with-dependencies
避免混合Laravel6的代码(Laravel6开始适配PHP8,可能引入高版本PHP的弃用兼容逻辑)。
3. 排查第三方依赖或自定义代码
部分第三方扩展或自定义代码可能自行开启PHP8的弃用警告,可在bootstrap/app.php顶部临时关闭弃用警告验证:
error_reporting(E_ALL & ~E_DEPRECATED);
若警告消失,逐一排查composer.json中的依赖包,更换为兼容PHP7.3的版本。
4. 调整PHP错误报告级别
查看PHP的php.ini文件,确认error_reporting未包含E_DEPRECATED。CLI环境可通过php -i | grep error_reporting查看,Web环境通过phpinfo()查看。修改配置:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
重启Valet服务:
valet restart
内容的提问来源于stack exchange,提问作者MP Simon

