Laravel app stopped working after upgrading to php 8

65,732

Solution 1

THE SOLUTION

As explained here latest version of laravel 6, 7 and 8 has made changes required for php 8. all you have to do is:

1- add php 8 to your composer.json (I've kept v7.4 just in case production server does not support php 8 yet)

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

2- to run composer update to update your laravel to the latest version

composer update

3- make sure update the following libraries since they exist in all laravel applications

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

4- check for any other library which needs to be updated, contribute if they haven't supported php 8. but you should be good to go with most of the libraries since they have active contributors.

EXPLAINING THE PROBLEM

as described here

PHP 8 introduces several improvements in PHP type systems such as the introduction of Union Types, mixed type, and a few more.

With these changes, certain methods in Reflection API's ReflectionParameter yield incorrect results.

In PHP 8, the following methods from ReflectionParameter class is deprecated:

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

ReflectionParamter::getType() is the recommended way to replace the deprecated methods. This method is available in PHP 7.0 and later.

Solution 2

Check your php version in your virtual machine(xampp or server).

php --version

Is that version PHP 8 ? Am I right? That's the cause of the problem:

PHP 8 introduces several improvements in PHP type systems such as the introduction of Union Types, mixed type, and a few more.

With these changes, certain methods in Reflection API's ReflectionParameter yield incorrect results.

In PHP 8, the following methods from ReflectionParameter class is deprecated:

  • ReflectionParameter::getClass()
  • ReflectionParameter::isArray()
  • ReflectionParameter::isCallable()
  • ReflectionParamter::getType()

Downgrade your php version to 7.4 and your Laravel app works like a charm!

Share:
65,732
Pezhvak
Author by

Pezhvak

I love programming, i'm doing this since i was 12 years old.. beside programming i love to make films! photography/movie making is my second thing..

Updated on September 20, 2021

Comments

  • Pezhvak
    Pezhvak almost 3 years

    after updating my mac to php 8 laravel app stopped working, this is the error I'm getting:

    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
    

    I've tried to fix the issue by investigating the code with no luck

  • matthiku
    matthiku over 3 years
    I updated my composer.json file, but when I run the composer update command, I still get the "deprecated" error so it seems like a catch-22 as composer runs the "artisan clear-compiled" command at the start and this is already causing the errors! Any ideas? I'm also not quite sure what your step 3 means, do I have to go into libraries and check their composer.json files?
  • matthiku
    matthiku over 3 years
    I got it working by temporarily removing the ""pre-update-cmd" from composer json. I also had to upgrade laravel/socialite to "^5.1". Anyway, thanks for your help above!
  • Pezhvak
    Pezhvak over 3 years
    @matthiku I don't think doing what you did is good (removing pre-update-cmd) my step 3 is to update those dependencies in your composer.yml file
  • adambg
    adambg over 3 years
    After running composer update i got an error message Killed. I had to upgrade composer to version 2 to make it work.
  • Mohamed Shahid
    Mohamed Shahid about 3 years
    Faker 1.9.1 throws an error in my case. Instead, I kept "fzaninotto/faker": "~1.4" and it works fine.
  • Jagadish Meghval
    Jagadish Meghval over 2 years
    this worked for med