使用 Composer 的 PHP 中的自动加载和命名空间问题 [重复]

Issue with Autoloading and Namespace in PHP using Composer [duplicate]

提问人:Ed Ke 提问时间:8/8/2023 更新时间:8/10/2023 访问量:33

问:

我很难理解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

似乎找不到类,我不确定如何解决此问题。

命名空间 composer-php 自动加载

评论

0赞 Nico Haase 8/9/2023
如果要使用自动加载器,则不应将类存储在文件中。是什么让你认为这应该有效?Test_Aa.php

答:

-1赞 Babatunde 8/9/2023 #1

根据 PSR-4 标准,类名必须与文件的名称匹配,才能自动加载。

从您的示例中,您应该Test_A类文件名为 Test_A.php。

此外,您不需要在 psr-4 映射下添加子目录。添加顶层目录后,目录 A 下的每个类都将具有以下命名空间:

类将在目录中Test\TestNamespace\A\Test_Asrc/A/

所以你真正需要做的就是拥有第一张地图。

评论

0赞 Babatunde 8/9/2023
并且不要忘记在更改 psr-4 映射时运行 composer dump-autoload