我对自动加载和命名空间非常陌生,并试图将名称空间添加到我的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目录。
答案 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
。