无法让我的自动加载器与名称空间一起使用

时间:2019-08-13 19:06:39

标签: php namespaces autoload

我的文件夹结构与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添加到定义路径和名称空间的代码中,但是我一直收到此错误。

2 个答案:

答案 0 :(得分:1)

在当前设置中,您已将文件夹src映射到基本名称空间myproject\Controllersmyproject\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;