我对自动加载和命名空间很陌生,并试图将命名空间添加到我的 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/