Laravel应用程序在升级到php8后停止工作



在将我的mac更新为php 8 laravel应用程序停止工作后,这是我得到的错误:

Deprecated: Method ReflectionParameter::getClass() is deprecated in /Users/.../Sites/.../vendor/laravel/framework/src/Illuminate/Container/Container.php on line 871
Deprecated: Method ReflectionParameter::getClass() is deprecated in /Users/.../Sites/.../vendor/laravel/framework/src/Illuminate/Container/Container.php on line 945
Deprecated: Method ReflectionParameter::getClass() is deprecated in /Users/.../Sites/.../vendor/laravel/framework/src/Illuminate/Container/Container.php on line 871
Deprecated: Method ReflectionParameter::getClass() is deprecated in /Users/.../Sites/.../vendor/laravel/framework/src/Illuminate/Container/Container.php on line 945

我试图通过调查代码来解决这个问题,但没有运气

解决方案

正如这里所解释的,laravel6、7和8的最新版本对php8进行了必要的更改。你所要做的就是:

1-将php8添加到composer.json中(我保留了7.4版,以防生产服务器还不支持php8(

"php": "^7.4|^8.0",

2-运行composer update将您的laravel更新为最新版本

composer update

3-确保更新以下库,因为它们存在于所有的laravel应用程序中

PHP to php:^8.0
Faker to fakerphp/faker:^1.9.1
PHPUnit to phpunit/phpunit:^9.3

4-检查是否有任何其他需要更新的库,如果他们不支持php8,请提供帮助。但是你应该很乐意使用大多数库,因为它们都有活跃的贡献者。

解释问题

如本文所述

PHP 8在PHP类型系统中引入了一些改进,例如引入了Union Types、混合类型等。

随着这些变化,反射API中的某些方法ReflectionParameter产生错误的结果。

在PHP8中,ReflectionParameter类中的以下方法是已弃用:

ReflectionParameter::getClass()
ReflectionParameter::isArray()
ReflectionParameter::isCallable()

ReflectionParamter::getType((是替换不推荐使用的方法。此方法在PHP7.0及更高版本中可用。

检查虚拟机(xampp或服务器(中的php版本。

php --version

那是PHP 8版本吗?我说得对吗?这就是问题的原因:

PHP8在PHP类型系统中引入了一些改进,例如引入了Union Types、混合类型等。

通过这些更改,Reflection API的ReflectionParameter中的某些方法会产生不正确的结果。

在PHP8中,不赞成使用ReflectionParameter类中的以下方法:

  • 反射参数::getClass((
  • 反射参数::isArray((
  • 反射参数::isCallable((
  • 反射参数::getType((

将你的php版本降级到7.4,你的Laravel应用程序就像一个魅力

我也遇到过类似的问题。但在我注意到这个问题之前,我已经运行了brew updatebrew cleanup。我做了什么:

  1. 我从brew cleanup中注意到了这个错误:
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/node
Target /usr/local/bin/node
already exists. You may want to remove it:
rm '/usr/local/bin/node'
To force the link and overwrite all conflicting files:
brew link --overwrite heroku-node
  1. 我运行了以下命令:
brew link --overwrite composer
composer upgrade
composer update

这就是对我的作用

如果您使用代客泊车,您应该执行以下操作:

  1. 从php8+降级到php7.4valet isolate php@7.4
  2. 然后使用代客valet composer update运行composer更新