【发布时间】:2019-12-22 11:41:28
【问题描述】:
我在 PSR-0 自动加载项目中按路径实例化类时遇到问题。结构如下:
| - src/
| - Models/
| - My_New_Model_Migration.php
| - ...
| SeederCommand.php
| - vendor/
| - ...
| composer.json
还有 Composer 自动加载器:
"autoload": {
"psr-0": {
"" : [
"src/"
]
}
}
在 SeederCommand 类中不多说,它基本上是一个 Doctrine/migrations 类,它应该使用 up() 和 down() 方法创建迁移。
在负责生成的函数里面我有这部分:
if (file_exists(__DIR__ . "/Models/{$model}_Migration.php")) {
$class = "{$model}_Migration";
$instantiated = new $class;
....
}
回显时,我注意到该文件确实存在,因此这部分正在正常工作。但是在更新课程时出现错误:
PHP 致命错误:未捕获的错误:类 '/var/www/html/.../src/Models/My_New_Model_Migration.php' 未在 /var/www/html/.../src/SeederCommand.php:97
由于路径是正确的,我认为问题一定是PSR-0 自动加载器通过下划线解析路径来工作?
有办法解决吗?
编辑:
This answer 对我没有帮助,因为它解释了自动加载器故事的“原因”。我知道PSR-0 和PSR-4 自动装载机在高级别上是如何工作的。我想要一种方法来解决自动加载器想要一个没有目录结构的事实(我不希望在这种情况下引入它)。
EDIT2:
SeederCommand 类需要自动加载文件:
require "../vendor/autoload.php";
我尝试做一个dump-autoload 并将类重命名为一个没有下划线的类,同样的事情发生了,所以我可能在自动加载方面做错了。
EDIT3:
我尝试更新一个我重命名为非下划线版本的类。例如,更新 MyNewClass 有效,但 My_New_Class 会引发错误。
【问题讨论】:
-
我不需要'为什么',我知道自动加载器是如何工作的 :) 如果它存在,我需要解决它
标签: php composer-php psr-0