【问题标题】:Class Foo\Bar\Baz located in ./foo/bar/utility/baz.php does not comply with psr-4 autoloading standard. Skipping类 Foo\Bar\Baz 位于 ./foo/bar/utility/baz.php 不符合 psr-4 自动加载标准。跳过
【发布时间】:2022-01-08 17:36:56
【问题描述】:

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

位于 ./foo/bar/utility/baz.php 的类 Foo\Bar\Baz 不符合 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 做好准备?

【问题讨论】:

    标签: php composer-php autoload


    【解决方案1】:

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

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

    路径案例

    最常见的原因是,如错误消息所示,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;)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多