位于./foo/bar/utility/baz.php中的类FooBarBaz不符合PSR-4自动加载标准。正在跳过

2022-02-24 00:00:00 php composer-php autoload

运行Composer的updateinstallrequiredump-autoload等时,突然收到黄色的弃用通知,提示:

位于./foo/bar/utility/baz.php中的类FooBarBaz不符合PSR-4自动加载标准。正在跳过。

在Composer 2.0之前,通常会收到:

弃用注意事项:位于./foo/bar/Baz.php中的类FooBarBaz不符合PSR-4自动加载标准。在Composer v2.0中将不再自动加载。在phar:/usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:201

为什么我会收到此通知或警告?要摆脱它并为Composer 2.0做好准备,我需要做些什么?


解决方案

发生这种情况的原因有多种。

重要的是要注意错误消息,它通常会非常准确地指向问题的根源。

路径大小写

最常见的原因是,如错误消息中所示,Bar.php路径名的不同组件的大小写与完全限定的类名的大小写不匹配;

foo/bar/Baz.phpAppBarBaz不匹配。

只需更新您的应用程序或包,使每个路径组件与其包含的命名空间的大小写匹配:

FooBarBaz.php

文件名和类名或命名空间差异

非常仔细地对照名称空间检查路径名。有时您将您的类(或命名空间)命名为FooBar,但是它在磁盘上的路径是";foo-bar";例如。或者只是因为某种原因,您的命名空间与文件的路径名不完全匹配。

这也将触发通知/警告。您需要重命名文件或重命名类(或命名空间)。

通常,更改路径或文件要容易得多,因为更改类或命名空间名称需要您重构代码以匹配新名称,而更改路径不需要重构任何内容。

嵌套命名空间和缺少声明

假设您有:

"autoload": {
        "psr-4": {
            "Fizz\Buzz\": "src/"
        }
    },

Dummy类,内部定义src/Buzz

// src/Buzz/Dummy.php
namespace FizzBuzz

class Dummy {}

上面的方法可以工作,但会像其他方法一样抛出通知。正确的方式应该是:

// src/Buzz/Dummy.php
namespace FizzBuzzBuzz

class Dummy {}

您不仅需要对受影响的类进行更改,还需要对使用或导入该类的任何其他文件进行更改。(例如,现在声明use FizzBuzzBuzzDummy;)。

相关文章