提问人:Ed Ke 提问时间:8/8/2023 更新时间:8/10/2023 访问量:33
使用 Composer 的 PHP 中的自动加载和命名空间问题 [重复]
Issue with Autoloading and Namespace in PHP using Composer [duplicate]
问:
我很难理解PHP中的命名空间概念。我应该设置
{
"name": "test/test-namespace",
"autoload": {
"psr-4": {
"Test\\TestNamespace\\": "src/",
"Test\\TestNamespace\\A\\": "src/A/",
"Test\\TestNamespace\\B\\": "src/B/",
"Test\\TestNamespace\\C\\": "src/C/"
}
},
"authors": [],
"require": {}
}
我的目录结构如下所示:
.
├── composer.json
├── index.php
├── src
│ ├── A
│ │ └── a.php
│ ├── B
│ │ └── b.php
│ └── C
│ └── c.php
└── vendor
├── autoload.php
例如,下面是位于 /A 文件夹中的 .php 的内容:
<?php
namespace Test\TestNamespace\A;
class Test_A {
public function __construct()
{
echo 'Test_A';
}
}
现在,我正在尝试使用命名空间调用类,如下所示:
<?php
require_once __DIR__ . "/vendor/autoload.php";
use Test\TestNamespace\A\Test_A;
use Test\TestNamespace\B\Test_B;
use Test\TestNamespace\C\Test_C;
$a = new Test_A();
$b = new Test_B();
但是,我收到以下错误消息,我不确定如何解决问题:
php index.php
PHP Fatal error: Uncaught Error: Class "Test\TestNamespace\A\Test_A" not found in .../PhpstormProjects/test-namespace/index.php:8
Stack trace:
#0 {main}
thrown in .../PhpstormProjects/test-namespace/index.php on line 8
Fatal error: Uncaught Error: Class "Test\TestNamespace\A\Test_A" not found in .../PhpstormProjects/test-namespace/index.php:8
Stack trace:
#0 {main}
thrown in .../PhpstormProjects/test-namespace/index.php on line 8
似乎找不到类,我不确定如何解决此问题。
答:
-1赞
Babatunde
8/9/2023
#1
根据 PSR-4 标准,类名必须与文件的名称匹配,才能自动加载。
从您的示例中,您应该Test_A类文件名为 Test_A.php。
此外,您不需要在 psr-4 映射下添加子目录。添加顶层目录后,目录 A 下的每个类都将具有以下命名空间:
类将在目录中Test\TestNamespace\A\Test_A
src/A/
所以你真正需要做的就是拥有第一张地图。
评论
0赞
Babatunde
8/9/2023
并且不要忘记在更改 psr-4 映射时运行 composer dump-autoload
评论
Test_A
a.php