我读了几个关于这个话题的问题,但我仍然不明白。我有一个库,我想把~/vendor文件夹和使用内置的作曲家自动加载器。我的包裹叫"哔"。目录结构为
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 { ....
作曲家。Json以
结尾"autoload": {
"psr-0": {"Beep\": "src/Beep"}
}
和still,当我尝试:
$r = new BeepRequest();
我得到:
Fatal error: Class 'BeepRequest' not found in ....
所有其他包的自动加载正在工作。我正在做作曲家更新,它声称它生成自动加载文件。
你知道我做错了什么吗?
谢谢
当您定义PSR-0自动加载时,类的名称将完全转换为路径和文件名,然后附加到您说包含前缀的路径。
相反,如果您定义PSR-4自动加载,则所提到的前缀将从类名中删除,其余部分将转换为路径和文件名,然后附加到路径中。
"psr-0": {"Beep\": "src/Beep"}
如果你自动加载一个类BeepRequest
,它将在src/Beep/Beep/Request.php
中被搜索。
"psr-4": {"Beep\": "src/Beep"}
这里几乎相同,但是因为"Beep"首先被剥离了类名,剩下的类名是Request
,然后搜索路径是src/Beep/Request.php
。
但是建议将路径长度保持在最小,所以我建议这样做:
"psr-4": {"Beep\": "src"}
然后删除可能为空的"Beep"目录(在这个级别上不能有Beep.php
文件,因为它不能包含有效的命名空间类,并且任何其他前缀都不匹配)。然后,您的BeepRequest
类将位于src/Request.php
。