php - 类 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 做好准备?
解决方案
这可能由于多种原因而发生。
重要的是要注意错误消息,它通常非常准确地指出问题的根源。
路径案例
最常见的原因是,如错误消息所示,路径名的不同组件的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;
)。
推荐阅读
- discord.js - 命令权限
- java - firebase ValueEventListener/onDataChange 只是将最后一个子节点从数据库中检索到 firebase recyclerview 并忽略其余的
- xml - 如何从销售 id 中过滤记录(创建 uid),仅针对基于销售的特定商家
- php - Laravel ORM 多对多关系就像一对多
- kubernetes - GitLab集成响应401中的helm安装
- java - 如何使用 Selenium 和 Java 从 Bootstrap Glyphicon 日期选择器中选择日期
- javascript - webworkers 中的 tensorflow.js
- c# - 是否有可能 Nlog 不写相同的消息
- angular - Angular:ng build --prod 上的“对象”类型上不存在属性“数据”
- html5-fullscreen - 在页面加载时进入全屏,无需人工干预