我很难理解 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 文件夹中的 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
好像找不到类,我不知道如何解决这个问题。
根据 PSR-4 标准,您的类名称必须与文件名称匹配才能自动加载。
从您的示例中,您应该将 Test_A 类文件名命名为 Test_A.php。
此外,您不需要在 psr-4 映射下添加子目录。添加顶级目录后,目录 A 下的每个类都将具有以下命名空间:
班级
Test\TestNamespace\A\Test_A
将在目录src/A/
中
所以你真正需要做的就是拥有第一张地图。