我很难理解如何通过psr-4
使用自动加载。
在加载流浪汉并设置和测试Homestead.yaml
中的所有变量后,我准备了如下文件结构:
\app
\folder
-- test.php
\vendor
\composer
-- autoload.php
-- index.php
-- composer.json
以下是我的代码:
的的index.php
<?PHP
namespace app;
require('vendor/autoload.php');
$object = new folder\test();
composer.json
"autoload":{
"psr-4":{
"app\\": "app"
}
}
test.php的
<?php
namespace app\folder;
class test
{
function __construct ()
{
echo 'construction done right.';
}
}
但是,在尝试访问该页面后,这些是页面上显示的错误消息:
(!)致命错误:未捕获错误:类&#39; app \ folder \ test&#39;在第6行的/home/vagrant/web/sites/app/index.php中找不到 (!)错误:类&#39; app \ folder \ test&#39;在第6行的/home/vagrant/web/sites/app/index.php中找不到
您能帮我理解并解决此错误吗?
答案 0 :(得分:2)
要修复当前设置,请使用以下命令:
"autoload":{
"psr-4":{
"app\\": ""
}
}
您的composer.json
位于app目录中,因此没有名为app的子目录可供参考。
我实际上建议您将目录结构更改为以下内容:
\app
\src
\folder
-- test.php
-- index.php
\vendor
\composer
-- autoload.php
-- index.php
-- composer.json
然后在composer.json中,设置以下内容:
"autoload":{
"psr-4":{
"app\\": "src"
}
}
这可以确保属于您的应用的所有文件都包含在内。命名空间包含在一个子目录中。
最后,我建议您使用供应商名称空间来防止冲突,并使用PSR-2的命名准则。
答案 1 :(得分:1)
它不起作用,因为您已告知Composer app
命名空间中的类位于app
子目录中,但没有app
子目录。
整个应用程序存储在app
目录中,它的名称对应用程序并不重要。 app
命名空间的类存储在当前目录中,子命名空间存储在具有相同名称的子目录中。
因此,您的composer.json
文件应为:
"autoload": {
"psr-4": {
"app\\": ""
}
}
或者,更清楚一点,您可以将.
(当前目录)作为app\
命名空间的位置:
"autoload": {
"psr-4": {
"app\\": "."
}
}
在主应用程序目录中进行更改后运行composer dump-autoloader
,它将开始工作。
答案 2 :(得分:0)
我认为您不需要PSR-4,只需添加classmap
classmap
参数例如:
"autoload": {
"classmap": [
"app"
]
}
添加此运行composer dump-autoload
后,您应该看到正在添加许多类。
希望这会有所帮助。
答案 3 :(得分:-1)
尝试设置
"autoload":{
"psr-4":{
"": "src/"
}
}
然后执行此命令
composer dump-autoload -o