Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PSR-0自动装弹机问题_Php_Composer Php_Psr 0 - Fatal编程技术网

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/"]
}