我的文件夹结构与PHP文件及其名称空间结合使用时遇到问题。
这是我的文件夹结构:
User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value
我的myproject
|
-- entry.php
-- src
|
-- IndexController.php
如下:
entry.php
我的<?php
spl_autoload_register(function (String $class) {
$sourcePath = __DIR__ . DIRECTORY_SEPARATOR . 'src';
$replaceRootPath = str_replace('myproject\Controllers', $sourcePath, $class);
$replaceDirectorySeparator = str_replace('\\', DIRECTORY_SEPARATOR, $replaceRootPath);
$filePath = $replaceDirectorySeparator . '.php';
if (file_exists($filePath)) {
require($filePath);
}
});
$indexController = new myproject\Controllers\IndexController;
$result = $indexController->controlSomething('this thing');
print($result);
如下:
src/IndexController.php
这很好用。但是,我想要一些不同的文件夹结构。我想更深入地存放一个文件夹,以使我的Controllers井井有条。因此,我想要一个<?php
namespace myproject\Controllers;
class IndexController
{
public function controlSomething(string $something): string {
return $something;
}
}
文件夹将我的控制器保存在那里。将我的文件夹结构更改为此:
Controllers
导致显示错误myproject
|
-- entry.php
-- src
|
-- Controllers
|
-- IndexController.php
。
我该如何实现?我尝试将Class 'myproject\Controllers\IndexController' not found
添加到定义路径和名称空间的代码中,但是我一直收到此错误。
答案 0 :(得分:1)
在当前设置中,您已将文件夹src
映射到基本名称空间myproject\Controllers
。 myproject\Controllers
之后出现的所有内容都将镜像从src
开始的子目录结构。
以下是:将IndexController
放在目录src\Controllers
中时,仅当全类名是myproject\Controllers\Controllers\IndexController
时,自动加载器才会找到它。
您可能想做的是直接将src
映射到myproject
,例如。
$replaceRootPath = str_replace('myproject', $sourcePath, $class);
我倾向于的解决方案是php的当前行业标准,该解决方案是使用composer作为自动加载器。
安装后,配置自动加载器将变得与此json段一样简单:
"autoload": {
"psr-4": {
"myproject\\": "src"
}
},
并且,可选地,
"autoload-dev": {
"psr-4": {
"myproject\\Test\\": "tests"
}
},
使用作曲家还有一个额外的好处,就是可以从大量的开源模块中提取信息以简化您的生活。
答案 1 :(得分:0)
尝试
<?php
namespace myproject\src\Controllers;