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


PHP - Namespace not found, autoload project with composer

我对自动加载和名称空间以及尝试将名称空间添加到我的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

/应用程序存储控制器和类等逻辑。

/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的命名约定,因为您似乎没有遵循它们。类名和命名空间文件夹应该大写,比如App'Classes'Engine而不是app'classes'engine