ReflectionParameter::getClass() 方法在 php 8.0.1 中已弃用

Gop*_*ish 3 laravel

我收到此错误:


PS C:\Users\User\Desktop\jk> php artisan serve
PHP Fatal error:  Uncaught ErrorException: Method ReflectionParameter::getClass() is deprecated in C:\Users\User\Desktop\jk\vendor\laravel\framework\src\Illuminate\Container\Container.php:788
Stack trace:




Run Code Online (Sandbox Code Playgroud)

Composer.json

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": "^7.4|^8.0",
        "laravel/framework": "5.4.*",
        "laravelcollective/html": "^5.3.0",
        "guzzlehttp/guzzle": "^6.3",
        "doctrine/dbal": "^2.9"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "^9.3",
        "symfony/css-selector": "3.1.*",
        "symfony/dom-crawler": "3.1.*"
    },
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "classmap": [
            "tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan optimize"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "platform": {
            "php": "8.0.1"
        }
    }
}


Run Code Online (Sandbox Code Playgroud)

Container.php 这里是代码的一部分


 protected function resolveClass(ReflectionParameter $parameter)
    {
        try {
            return $this->make($parameter->getClass()->name);
        }

        // If we can not resolve the class instance, we will check to see if the value
        // is optional, and if it is we will return the optional parameter value as
        // the value of the dependency, similarly to how we do this with scalars.
        catch (BindingResolutionException $e) {
            if ($parameter->isOptional()) {
                return $parameter->getDefaultValue();
            }

            throw $e;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Method ReflectionParameter::getClass() 已弃用。我认为 getclass 方法在版本 8.0.1 中已弃用,而不是我尝试使用 ReflectionParameter::getType() 之类的链接 ,但不起作用。而且成员还建议此 Laravel 应用程序在之后停止工作升级到 php 8我也尝试过这个但不起作用

小智 12

因为 ReflectionParameter::getClass() 在 php 8 中已被弃用。

解决方案转到

vendor\laravel\framework\src\Illuminate\Container\Container.php
Run Code Online (Sandbox Code Playgroud)

并前往

受保护函数resolvePrimitive(ReflectionParameter $parameter)

并替换

$parameter->getClass()** with **$parameter->getType()->getName()


apo*_*fos 5

Laravel 5.4 似乎有不正确的平台要求。具体来说,它需要 PHP 版本 >= 5.6,但它的代码无法在 PHP 8 中工作。由于 5.4 已经结束,我不希望任何官方代码更改使其适用于 PHP 8,因此您要么需要 fork 并维护您自己的 Laravel 5.4 分支来解决这些问题,或者将您的 Laravel 版本升级到支持 PHP 8 的版本。

第一个支持 PHP 8 的 Laravel 版本是 Laravel 6