Class composer 和 psr-4 找不到文件
Class file not found by composer and psr-4
我很难理解如何通过 psr-4
使用自动加载。
加载 vagrant 并设置和测试 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.';
}
}
但是,在尝试访问该页面后,页面上显示了以下错误消息:
(!) Fatal error: Uncaught Error: Class 'app\folder\test' not found in /home/vagrant/web/sites/app/index.php on line 6
( ! ) Error: Class 'app\folder\test' not found in /home/vagrant/web/sites/app/index.php on line 6
你能帮我理解并修复这个错误吗?
在composer.json中尝试设置
"autoload":{
"psr-4":{
"": "src/"
}
}
然后执行这个命令
composer dump-autoload -o
它不起作用,因为您已经告诉 Composer app
命名空间中的 类 在 app
子目录中,但没有 app
子目录。
整个应用程序都存储在 app
目录中,它的名称对于应用程序来说并不重要。 app
命名空间的类存放在当前目录下,子命名空间存放在同名子目录下。
因此,您的 composer.json
文件应为:
"autoload": {
"psr-4": {
"app\": ""
}
}
或者,为了更清楚,您可以将 .
(当前目录)作为 app\
命名空间的位置:
"autoload": {
"psr-4": {
"app\": "."
}
}
在主应用程序目录中进行更改 运行 composer dump-autoloader
后,它将开始工作。
要针对您当前的设置修复它,请使用以下方法:
"autoload":{
"psr-4":{
"app\": ""
}
}
您的 composer.json
在应用程序目录中,因此没有名为 app 的子目录可供参考。
我实际上建议将您的目录结构更改为以下内容:
\app
\src
\folder
-- test.php
-- index.php
\vendor
\composer
-- autoload.php
-- index.php
-- composer.json
然后在composer.json中设置如下:
"autoload":{
"psr-4":{
"app\": "src"
}
}
这确保属于您的 'app' 命名空间的所有文件都包含在一个子目录中。
最后,我建议您使用供应商命名空间来防止冲突,并使用 PSR-2 中的命名指南。
我认为您不需要 PSR-4 只需添加 classmap
classmap
参数例如:
"autoload": {
"classmap": [
"app"
]
}
添加此 运行 composer dump-autoload
后,您应该会看到添加了一些 类。
希望对您有所帮助。
我很难理解如何通过 psr-4
使用自动加载。
加载 vagrant 并设置和测试 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.';
}
}
但是,在尝试访问该页面后,页面上显示了以下错误消息:
(!) Fatal error: Uncaught Error: Class 'app\folder\test' not found in /home/vagrant/web/sites/app/index.php on line 6
( ! ) Error: Class 'app\folder\test' not found in /home/vagrant/web/sites/app/index.php on line 6
你能帮我理解并修复这个错误吗?
在composer.json中尝试设置
"autoload":{
"psr-4":{
"": "src/"
}
}
然后执行这个命令
composer dump-autoload -o
它不起作用,因为您已经告诉 Composer app
命名空间中的 类 在 app
子目录中,但没有 app
子目录。
整个应用程序都存储在 app
目录中,它的名称对于应用程序来说并不重要。 app
命名空间的类存放在当前目录下,子命名空间存放在同名子目录下。
因此,您的 composer.json
文件应为:
"autoload": {
"psr-4": {
"app\": ""
}
}
或者,为了更清楚,您可以将 .
(当前目录)作为 app\
命名空间的位置:
"autoload": {
"psr-4": {
"app\": "."
}
}
在主应用程序目录中进行更改 运行 composer dump-autoloader
后,它将开始工作。
要针对您当前的设置修复它,请使用以下方法:
"autoload":{
"psr-4":{
"app\": ""
}
}
您的 composer.json
在应用程序目录中,因此没有名为 app 的子目录可供参考。
我实际上建议将您的目录结构更改为以下内容:
\app
\src
\folder
-- test.php
-- index.php
\vendor
\composer
-- autoload.php
-- index.php
-- composer.json
然后在composer.json中设置如下:
"autoload":{
"psr-4":{
"app\": "src"
}
}
这确保属于您的 'app' 命名空间的所有文件都包含在一个子目录中。
最后,我建议您使用供应商命名空间来防止冲突,并使用 PSR-2 中的命名指南。
我认为您不需要 PSR-4 只需添加 classmap
classmap
参数例如:
"autoload": {
"classmap": [
"app"
]
}
添加此 运行 composer dump-autoload
后,您应该会看到添加了一些 类。
希望对您有所帮助。