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

时间:2016-04-12 16:35:47

标签: php namespaces composer-php autoload psr-0

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

所以在我的作曲家中我添加了:

"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存储控制器和类等逻辑。

/ web是网络根目录 - index.php是访问者看到的页面,也是通过此处处理的所有内容。

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

1 个答案:

答案 0 :(得分:2)

有几件事情出错了。首先,您要在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