PHP - 未找到命名空间,使用 Composer 自动加载项目

标签 php namespaces composer-php autoload psr-0

我对自动加载和命名空间很陌生,并试图将命名空间添加到我的 MVC 项目中。

所以在我的 Composer 中,我添加了:

"autoload": {
    "psr-0": {
        "prj\\app\\": "app/",
        "prj\\app\\controller\\": "app/controller/",
        "prj\\app\\classes\\": "app/classes/"
    }
}

然后更新 composer 并运行 autodump 命令。

然后我回到我的应用程序尝试使用这些命名空间之一,但是我得到了以下回复:
use \app\classes\engine; // use statement I tried

Fatal error: Uncaught Error: Class 'app\classes\engine' not found in C:\inetpub\wwwroot\web\index.php:87 Stack trace: #0 {main} thrown in C:\inetpub\wwwroot\web\index.php on line 87

我不确定为什么它无法使用命名空间找到类,这是我的整个文件夹结构,如果它可能有任何用处:
PRJ
├───app
│   ├───classes
│   └───controller
├───web
│   └───index.php
├───vendor
│   ├───bin
│   ├───composer
│   ├───...
└───view
    ├───bootstrap
    └───default

/app 存储 Controller 和类等逻辑。

/web 是 web 根 - index.php 是访问者看到的页面,所有内容都通过这里处理。

/vendor 是存储我的依赖项的 composer 目录。

最佳答案

有几件事情出错了。首先,您要在 composer.json 中添加重复的命名空间:

线路:

"prj\\app\\controller\\": "app/controller/",
"prj\\app\\classes\\": "app/classes/"

是不必要的,因为它们已经包含在:
"prj\\app\\": "app/",

只要app下的目录匹配您使用的命名空间的名称,无需明确定义它。所以你可以添加:
"autoload": {
    "psr-0": {
        "prj\\app\\": "app/"
    }
}

其次,您的 use声明似乎不对,您正在尝试:
use \app\classes\engine;

如果您已经在同一个命名空间中,那么这里不需要前导斜杠。此外,您将命名空间自动加载为 prj\app而不是 app ,所以你错过了 prj少量。它应该看起来像这样(当这是 app 文件夹中的文件时):
<?php

namespace prj\app\controller;

use prj\app\classes\engine;

class MyController
{
    /**
     * @var engine
     */    
    private $engine;

    public function __construct()
    {
        // This should now work since engine should be autoloaded
        $this->engine = new engine();
    }
}

也看看PSR-0 naming conventions因为你似乎没有关注他们。类名和命名空间文件夹应该大写,如 App\Classes\Engine而不是 app\classes\engine .

关于PHP - 未找到命名空间,使用 Composer 自动加载项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36579201/

相关文章:

php - switch 语句中的 @noinspection 注释残渣清理

clojure - Clojure 中 use 和 require 之间的区别

jquery - jquery 小部件上的命名空间应该使用什么?

php - 如果 classmap 实际上更快,为什么要在 composer 中使用 PSR-0 或 PSR-4 自动加载?

javascript - 警报适用于条件,但按下 “OK” 时会重定向到其他页面,并且不允许用户更改输入

php - utf-8转iso-8859-1编码问题

php - 如何从命令行将参数传递给 Composer 脚本?

php - composer.lock 时间戳格式

php - 当我在 .php url 后面加上斜杠 (/) 时会发生什么?

C++ extern 关键字和全局变量