我已经阅读了关于这个主题的几个问题,但我仍然无法弄明白。 我有一个库,我想放在〜/ vendor文件夹中,并使用内置的composer autoloader。 我的包名叫#34; beep"。目录结构是
vendor/beep
vendor/beep/beep
vendor/beep/beep/src
vendor/beep/beep/src/Beep
vendor/beep/beep/src/Beep/Request.php
Request.php以:
开头namespace Beep;
class Request { ....
composer.json以
结尾"autoload": {
"psr-0": {"Beep\\": "src/Beep"}
}
仍然在我尝试的时候:
$r = new Beep\Request();
我明白了:
Fatal error: Class 'Beep\Request' not found in ....
所有其他软件包的自动加载工作正常。 我正在做作曲家更新,它声称它生成自动加载文件。
知道我做错了吗?
由于
答案 0 :(得分:8)
当你定义PSR-0自动加载时,类的名称将完全转换为路径和文件名,然后附加到你说的包含前缀的路径。
相反,如果您定义了PSR-4自动加载,则会从类名中删除前面提到的前缀,其余部分将转换为路径和文件名,然后附加到路径中。
"psr-0": {"Beep\\": "src/Beep"}
如果您对课程\Beep\Request
进行自动加载,则会在src/Beep/Beep/Request.php
进行搜索。
"psr-4": {"Beep\\": "src/Beep"}
此处几乎相同,但由于“Beep”首先被删除了类名,剩下的类名为Request
,然后搜索路径为src/Beep/Request.php
。
但是建议将路径长度保持在最小,所以我建议这样做:
"psr-4": {"Beep\\": "src"}
然后删除可能为空的“Beep”目录(您不能在此级别拥有Beep.php
文件,因为它不能包含有效的命名空间类,并且任何其他前缀都不匹配)。您的Beep\Request
课程将位于src/Request.php
。