Fatal error: Uncaught Error: Class 'Project\Router\Hello' not found

Fatal error: Uncaught Error: Class 'Project\Router\Hello' not found

这是我第一次使用 Composer,我有点疯狂地想弄清楚为什么它没有选择我的命名空间。

在我的 project/ 目录中:

├── composer.json
├── composer.lock
├── composer.phar
├── README.md
├── vendor (truncated)
└── src
    ├── Config.php
    ├── Handler.php
    └── Router.php

src/Config.php

<?php
$project_root = realpath(__DIR__ . '/..');
$autoload = $project_root . '/vendor/autoload.php';
?>

src/Router.php

<?php namespace Project\Router;
include_once("Config.php");
require $autoload;

use Project\Handler;

Hello::world();
?>

src/Handler.php

<?php namespace Project\Handler;

include_once("Config.php");
require $autoload;

class Hello {
    public function world() {
        echo "Hello world!";
    }
}
?>

composer.json

{
    "autoload": {
        "psr-4": {
            "Project\": "src"
        }
    }
}

http://127.0.1.1/project/src/Router.php:

Fatal error: Uncaught Error: Class 'Project\Router\Hello' not found in /path/to/project/src/Router.php:38(not actual line) Stack trace: #0 {main} thrown in /path/to/project/src/Router.php on line 38(not actual line)

我能够使用外部依赖项,所以我的一般 Composer 设置似乎没问题。我只是不知道我在自己的命名空间上搞砸了哪里。

您似乎误解了 PSR4 的工作原理。

"autoload": {
    "psr-4": {
        "Project\": "src"
    }
}

此配置意味着如果您从自动加载器请求 class Project\Handler\Hello,它将检查路径 src\Handler\Hello.php(不存在。)

如果您将目录结构更改为以下内容,它将起作用:

└── src
    ├── Config.php
    ├── Router.php
    └── Handler
        └── Hello.php (renamed from Handler.php)

此外,Config.php 或 Router.php 都不包含 classes,这违背了使用 class 自动加载器的意义。

读一读:http://www.php-fig.org/psr/psr-4/