Class Foo\Bar\Baz 位于 ./foo/bar/utility/baz.php 不符合 psr-4 自动加载标准。跳绳
Class Foo\Bar\Baz located in ./foo/bar/utility/baz.php does not comply with psr-4 autoloading standard. Skipping
当运行作曲家的update
、install
、require
、dump-autoload
等;我突然开始收到黄色弃用通知,上面写着:
Class Foo\Bar\Baz located in ./foo/bar/utility/baz.php does not comply with psr-4 autoloading standard. Skipping.
在 Composer 2.0 之前,一个用来得到:
Deprecation Notice: Class Foo\Bar\Baz located in ./foo/bar/Baz.php does not comply with psr-4 autoloading standard. It will not autoload anymore in Composer v2.0. in phar:///usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:201
为什么我会收到此通知或警告?我需要什么才能摆脱它并为 Composer 2.0 做好准备?
发生这种情况的原因有多种。
重要的是注意错误消息,它通常非常准确指向问题的根源。
路径大小写
最常见的原因是,如错误消息所示,Bar.php
的路径名的不同部分的大小写与完全限定的 [=59= 的大小写不匹配] 姓名;
foo/bar/Baz.php
不匹配 App\Bar\Baz
.
只需更新您的应用程序或程序包,使每个路径组件与其拥有的命名空间的大小写相匹配:
Foo\Bar\Baz.php
文件名和 Class 名称或命名空间差异
非常仔细地对照命名空间检查路径名。例如,有时您将 class(或您的命名空间)命名为 FooBar
,但它在磁盘上的路径是“foo-bar”。或者只是出于任何原因,您的命名空间与文件的路径名不完全匹配。
这也会触发 notice/warning。您需要重命名文件或重命名 classes(或命名空间)。
通常,更改路径或文件要容易得多,因为更改 class 或命名空间名称需要重构代码以匹配新名称,而更改路径则不需要重构任何内容。
嵌套命名空间和缺少声明
假设您有:
"autoload": {
"psr-4": {
"Fizz\Buzz\": "src/"
}
},
和classDummy
,定义在里面src/Buzz
:
// src/Buzz/Dummy.php
namespace Fizz\Buzz
class Dummy {}
以上方法可行,但会像其他方法一样抛出通知。正确的方法是:
// src/Buzz/Dummy.php
namespace Fizz\Buzz\Buzz
class Dummy {}
您不仅需要对受影响的 class 进行更改,还需要对使用或导入此 class 的任何其他文件进行更改。 (例如,现在声明 use Fizz\Buzz\Buzz\Dummy;
)。
当运行作曲家的update
、install
、require
、dump-autoload
等;我突然开始收到黄色弃用通知,上面写着:
Class Foo\Bar\Baz located in ./foo/bar/utility/baz.php does not comply with psr-4 autoloading standard. Skipping.
在 Composer 2.0 之前,一个用来得到:
Deprecation Notice: Class Foo\Bar\Baz located in ./foo/bar/Baz.php does not comply with psr-4 autoloading standard. It will not autoload anymore in Composer v2.0. in phar:///usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:201
为什么我会收到此通知或警告?我需要什么才能摆脱它并为 Composer 2.0 做好准备?
发生这种情况的原因有多种。
重要的是注意错误消息,它通常非常准确指向问题的根源。
路径大小写
最常见的原因是,如错误消息所示,Bar.php
的路径名的不同部分的大小写与完全限定的 [=59= 的大小写不匹配] 姓名;
foo/bar/Baz.php
不匹配 App\Bar\Baz
.
只需更新您的应用程序或程序包,使每个路径组件与其拥有的命名空间的大小写相匹配:
Foo\Bar\Baz.php
文件名和 Class 名称或命名空间差异
非常仔细地对照命名空间检查路径名。例如,有时您将 class(或您的命名空间)命名为 FooBar
,但它在磁盘上的路径是“foo-bar”。或者只是出于任何原因,您的命名空间与文件的路径名不完全匹配。
这也会触发 notice/warning。您需要重命名文件或重命名 classes(或命名空间)。
通常,更改路径或文件要容易得多,因为更改 class 或命名空间名称需要重构代码以匹配新名称,而更改路径则不需要重构任何内容。
嵌套命名空间和缺少声明
假设您有:
"autoload": {
"psr-4": {
"Fizz\Buzz\": "src/"
}
},
和classDummy
,定义在里面src/Buzz
:
// src/Buzz/Dummy.php
namespace Fizz\Buzz
class Dummy {}
以上方法可行,但会像其他方法一样抛出通知。正确的方法是:
// src/Buzz/Dummy.php
namespace Fizz\Buzz\Buzz
class Dummy {}
您不仅需要对受影响的 class 进行更改,还需要对使用或导入此 class 的任何其他文件进行更改。 (例如,现在声明 use Fizz\Buzz\Buzz\Dummy;
)。