【问题标题】:Fatal error: Uncaught Error: Class 'Project\Router\Hello' not found致命错误:未捕获的错误:找不到类“Project\Router\Hello”
【发布时间】:2016-10-21 23:36:35
【问题描述】:

这是我第一次使用 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:

致命错误:未捕获的错误:在 /path/to/project/src/Router.php:38 中找不到类“Project\Router\Hello”:38(不是实际行)堆栈跟踪:#0 {main} throw in / path/to/project/src/Router.php 在第 38 行(不是实际行)

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

【问题讨论】:

  • 只是为了好玩,你试过用\Project\Handler\Hello::world();代替use吗?
  • @Machavity 是的,我肯定有。同样的错误。

标签: php namespaces composer-php autoload


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 2023-03-25
    • 2018-09-06
    • 2018-05-11
    • 2020-11-09
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多