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