这是我项目的部分结构
root
|-App
|--Controller
|--Common
|-HomeController.php
|-HeaderController.php
|-FooterController.php
|-SidebarController.php
|--Info
|-AboutController.php
|-ContactController.php
我将控制器放在相应的目录中以便更好地管理。
我最近为他们添加了名称空间。
HomeController.php = namespace app\controller\common;
HeaderController.php = namespace app\controller\common;
AboutController.php = namespace app\controller\info;
ContactController.php = namespace app\controller\info;
要加载这些控制器,我正在检查
下面的自动加载器spl_autoload_register(function ($class) {
$prefix = 'app\controller\common\\';
$base_dir = __DIR__ . '/app/controller/common/'; // your classes folder
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relative_class = substr($class, $len);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if (file_exists($file)) {
require $file;
}
});
$home = new app\controller\common\HomeController();
$home->index();
它可以工作,即它自动加载文件夹应用程序中的所有控制器>控制器>共同。
问题是我不明白如何加载不同文件夹中的所有其他控制器(如Info文件夹中的控制器)和不同的子命名空间(命名空间app \ controller \ info,命名空间app \ controller \ client) )?
autoload的名称空间前缀定义为$prefix = 'app\controller\common\\';
,我想这是我需要修复以容纳所有其他控制器来加载它们。
如何修复此$前缀?
答案 0 :(得分:1)
你有正确的想法。但你去了匿名函数,这本身并不一定是错的,它只是不适合你当前的案例问题。你有更好的常规功能。
你可以这样做:
spl_autoload_register('myAutoloader');
function myAutoloader($path) {
foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path),\FilesystemIterator::SKIP_DOTS) as $file) {
if ($file->getFileExtension() == 'php') {
require $file->getFilename() . $file->getFileExtension();
}
}
}
此函数将通过文件夹递归迭代,并require
找到它的任何php文件。它不会做的是处理各种依赖关系,所以请记住这一点。
spl_autoload_register()允许您注册PHP将放入堆栈/队列的多个函数(或来自您自己的Autoload类的静态方法),并在声明“new Class”时按顺序调用。
引用来自this问题,我强烈建议您阅读。
话虽如此,我鼓励您使用Composer。它专为您的确切问题而设计。你可以用它加载任何东西。不只是php文件。