0

我收到此错误:


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:




作曲家.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"
        }
    }
}


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;
        }
    }

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

4

4 回答 4

4

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

解决方案去

vendor\laravel\framework\src\Illuminate\Container\Container.php

然后去

受保护的函数resolvePrimitive(ReflectionParameter $parameter)

并更换

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

于 2021-12-03T21:35:47.233 回答
3

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

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

于 2021-06-13T05:19:46.020 回答
1

您可以将其替换getType()文档建议的 . 您必须ReflectionClassReflectionType. 这应该可以解决问题。

$reflectionClass = new ReflectionClass($reflectionParam->getType()->getName());

我有这个沙箱,它帮助我确保它按预期工作。

于 2021-06-13T02:00:28.047 回答
0

您可能需要使用以下命令更新您的全局 composer.json:

composer global update

我遇到了一些烦人的问题,所以我不得不运行:

composer global update --ignore-platform-reqs
于 2022-01-31T18:01:51.553 回答