首页 > 解决方案 > 类 Foo\Bar\Baz 位于 ./foo/bar/utility/baz.php 不符合 psr-4 自动加载标准。跳过

问题描述

运行作曲家的update, install, require,dump-autoload等时;我突然开始收到一个黄色的弃用通知,上面写着:

类 Foo\Bar\Baz 位于 ./foo/bar/utility/baz.php 不符合 psr-4 自动加载标准。跳过。

在 Composer 2.0 之前,用于获取:

弃用通知:位于 ./foo/bar/Baz.php 的类 Foo\Bar\Baz 不符合 psr-4 自动加载标准。它不会在 Composer v2.0 中自动加载。在 phar:///usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:201

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

标签: phpcomposer-phpautoload

解决方案


这可能由于多种原因而发生。

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

路径案例

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

foo/bar/Baz.php不匹配App\Bar\Baz

只需更新您的应用程序或包,以便每个路径组件都匹配它所拥有的命名空间的大小写:

Foo\Bar\Baz.php

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

非常仔细地检查命名空间的路径名。有时你命名你的类(或你的命名空间)FooBar,但它在磁盘上的路径是“foo-bar”,例如。或者只是出于任何原因,您的命名空间与文件的路径名不完全匹配。

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

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

嵌套命名空间和缺少声明

假设您有:

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

而类,在里面Dummy定义: src/Buzz

// src/Buzz/Dummy.php
namespace Fizz\Buzz

class Dummy {}

以上将起作用,但会像其他人一样抛出通知。正确的方法是:

// src/Buzz/Dummy.php
namespace Fizz\Buzz\Buzz

class Dummy {}

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


推荐阅读