使用 Composer 在 PHP 中自动加载和命名空间的问题

问题描述 投票:0回答:1

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

好像找不到类,我不知道如何解决这个问题。

php namespaces composer-php autoload
1个回答
0
投票

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

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

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

班级

Test\TestNamespace\A\Test_A
将在目录
src/A/

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

© www.soinside.com 2019 - 2024. All rights reserved.