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

时间:2018-11-18 07:56:33

标签: php composer-php autoloader psr-4

是有关“找不到类”错误的另一个问题。我可能丢失了一些东西,或者我误解了PSR-4逻辑。

我的作曲家库目录结构:

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

Test.php

namespace MyNS;

class Test
{
}

composer.json

"autoload": {
        "psr-4": {
            "MyNS\\": "src/"
        },
}

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

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

$test = new MyNS\Test();

总是导致

  

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

。我想念什么?我现在盯着这几天了。我更改了文件夹,更改了文件夹名称,更改了uppper的值,反之亦然。似乎没有任何作用。

我正在使用PHP 7.2.2和Composer 1.2.2版

甚至尝试过:

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

use MyNS\Test;

$scanner = new Test();

更新

我调试了Composer ClassLoader.php文件(findFileWithExtension($ class,$ ext))方法,显然我的文件从未加载过,因为我收到了回声“ 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/"
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我认为问题出在您的命名空间声明中

您从MyNS调用类,但类名称空间为namespace MyNS\PSR4;

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

$test = new MyNS\Test();

// it should be new MyNS\PSR4\Test();

并确保您的类文件位于composer autoload文件

中提到的同一目录中

对于类名称的任何更改,您还必须运行dump-autoload命令

您可以访问此autoload功能

答案 1 :(得分:0)

要调试正在打开的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;
}

在手动修改完上述文件后,请勿执行composer dumpautoload,直到完成。

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

path/to/project/vendor/composer/../../src/Test.php

哪个是

path/to/project/src/Test.php

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

namespace MyNS;

class Test { }

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

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