位于./foo/bar/utility/baz.php中的类FooBarBaz不符合PSR-4自动加载标准。正在跳过
运行Composer的update
、install
、require
、dump-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.php
与AppBarBaz
不匹配。
只需更新您的应用程序或包,使每个路径组件与其包含的命名空间的大小写匹配:
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;
)。
相关文章