Composer PSR-4 自动加载“找不到类”调试

Dig*_*man 3 php autoloader composer-php psr-4

是的,另一个关于“找不到类”错误的问题。要么是我遗漏了什么,要么是我误解了 PSR-4 逻辑。

我的作曲家库目录结构:

“扫描仪”=>“src”=>“Test.php”

测试.php

namespace MyNS;

class Test
{
}
Run Code Online (Sandbox Code Playgroud)

作曲家.json

"autoload": {
        "psr-4": {
            "MyNS\\": "src/"
        },
}
Run Code Online (Sandbox Code Playgroud)

因此,现在我使用 Composer 将库加载到我的项目中并尝试使用它。

require_once("../vendor/autoload.php");

$test = new MyNS\Test();
Run Code Online (Sandbox Code Playgroud)

这总是导致

“致命错误:未捕获错误:未找到类‘MyNS\Test’。”

。我缺少什么?我已经盯着这个看了好几天了。我更改了文件夹,更改了文件夹名称,将上层更改为下层,反之亦然。似乎什么都不起作用。

我正在使用 PHP 7.2.2 和 Composer 版本 1.2.2

甚至尝试过这个:

require_once("../vendor/autoload.php");

use MyNS\Test;

$scanner = new Test();
Run Code Online (Sandbox Code Playgroud)

更新

我调试了 Composer ClassLoader.php 文件 (findFileWithExtension($class, $ext)) 方法,显然我的文件从未加载,因为我得到了 echo“Done”和 die(); 在此方法的末尾,这意味着找不到该文件,因此未加载该文件。我的composer.json 有什么问题吗?

{
    "name": "test/test",
    "type": "library",
    "description": "",
    "keywords": ["php"],
    "homepage": "",
    "license": "MIT",
    "authors": [
        {
            "name": "",
            "email": "",
            "homepage": "",
            "role": ""
        }
    ],
    "require": {
        "php": ">=7.2.2"
    },
    "autoload": {
        "psr-4": {
            "MyNS\\": "src/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

rev*_*evo 7

要调试正在发生的情况,请打开ClassLoader.php文件,然后转到findFileWithExtension()定义方法的地方添加echo语句:

# vendor/composer/ClassLoader.php:386

foreach ($this->prefixDirsPsr4[$search] as $dir) {
    if (file_exists($file = $dir . $pathEnd)) {
        return $file;
    }
    // Add this line
    echo $file, PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

在您手动修改上述文件后,请不要执行此操作composer dumpautoload,直到我们完成为止。

现在,通过执行 PHP 文件,您将在输出的开头看到类似的内容:

path/to/project/vendor/composer/../../src/Test.php
Run Code Online (Sandbox Code Playgroud)

这是:

path/to/project/src/Test.php
Run Code Online (Sandbox Code Playgroud)

这就是作曲家正在寻找的文件,并且应该包含如下内容:

namespace MyNS;

class Test { }
Run Code Online (Sandbox Code Playgroud)

如果包含文件时出现问题,则意味着您必须关心三件事:

  1. 路径和文件名
  2. 文件中使用的命名空间
  3. 文件中使用的类名(类名应与文件名相同)