Php PSR-0自动装弹机问题
在我的Php PSR-0自动装弹机问题,php,composer-php,psr-0,Php,Composer Php,Psr 0,在我的PSR-0autoloaded项目中,我无法按路径实例化类。结构如下: | - src/ | - Models/ | - My_New_Model_Migration.php | - ... | SeederCommand.php | - vendor/ | - ... | composer.json 和作曲家自动加载器: "autoload": { "psr-0": { "" : [ "sr
PSR-0
autoloaded项目中,我无法按路径实例化类。结构如下:
| - src/
| - Models/
| - My_New_Model_Migration.php
| - ...
| SeederCommand.php
| - vendor/
| - ...
| composer.json
和作曲家自动加载器:
"autoload": {
"psr-0": {
"" : [
"src/"
]
}
}
在SeederCommand
类中没有太多内容,它基本上是一个条令/迁移类,应该使用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
autoloader通过下划线解析路径的方式下发生的
有什么办法吗
编辑:
这对我没有帮助,因为它解释了自动加载器故事的“原因”。我知道PSR-0
和PSR-4
自动装弹机是如何在高水平上工作的。我想了解一下autoloader想要一个没有目录结构的目录结构(我不希望在本例中引入它)
EDIT2:
种子命令
类需要自动加载文件:
require "../vendor/autoload.php";
我尝试过做一个转储自动加载
,并将类重命名为一个没有下划线的类,同样的事情也发生了,所以我可能在自动加载本身时出错了
EDIT3:
我已经尝试过更新一个我重命名为非下划线版本的类。例如,新建MyNewClass
可以工作,但是myu New\u Class
会抛出一个错误。创建新类实例时出错
$class=\uuuu DIR\uuuu。“/Models/{$model}\u Migration.php”;
$instanced=新的$class;
这是错误的,因为您无法通过其文件名创建类的实例,如:
$instance = new /var/www/html/.../Class.php; // <-- wrong
所以在你的特殊情况下,它可能是
$class = "\\Project\\Models\\".$model."_Migration";
// ^ depends on the real namespace and name of your migration classes
$instantiated = new $class;
PSR-0和下划线
在再次阅读之后,我真诚地认为在使用PSR-0时无法实现您想要的功能(使用带下划线的类名但没有目录)。该标准明确规定:
类名中的每个u字符都转换为目录分隔符
可能的解决方案:类映射自动加载程序
但是,您可以将其用于这些文件:
此映射是通过扫描给定目录/文件中所有.php和.inc文件中的类构建的。您可以使用类映射生成支持为所有不遵循PSR-0/4的库定义自动加载。要配置此选项,请指定要搜索类的所有目录或文件
它可能看起来像这样(但我无法测试):
类名中不能有下划线,目录结构中也不能有下划线
如果您的类名为Models\u mywhater\u Migration
,因为您在迁移过程中动态地将字符串“mywhater”添加到类名中,那么该类必须放在src/Models/mywhater/Migration.php
中。您不能在src/Models/MyWhatever\u Migration.php
中使用它
如果要将下划线保留为文件名的一部分,则必须切换到PSR-4并使用名称空间。我不需要“为什么”,我知道autoloader是如何工作的:)如果它存在,我需要绕过它。你是对的。这确实解决了问题的一部分,但是问题仍然存在(检查我上次的编辑)@Norgul我刚刚更新了我的答案,也许它可以帮助你。
$class = "\\Project\\Models\\".$model."_Migration";
// ^ depends on the real namespace and name of your migration classes
$instantiated = new $class;
"autoload": {
"psr-0": {
"" : [
"src/"
]
},
"classmap": ["src/Models/"]
}