"src"=> "Test.php" 测试.php namespace-6ren">
gpt4 book ai didi

php - Composer PSR-4 自动加载 "class not found"调试

转载 作者:行者123 更新时间:2023-12-04 17:44:43 25 4
gpt4 key购买 nike

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

我的作曲库目录结构:

"扫描仪"=> "src"=> "Test.php"

测试.php

namespace MyNS;

class Test
{
}

Composer .json

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

所以,现在我用 composer 将库加载到我的项目中并尝试使用它。

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

$test = new MyNS\Test();

这总是导致

"Fatal error: Uncaught Error: Class 'MyNS\Test' not found."

.我错过了什么?我现在盯着这个看好几天了。我已经更改了文件夹,我已经更改了文件夹名称,我已经将uppper更改为lower,反之亦然。似乎没有任何效果。

我正在使用 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)) 方法,显然我的文件从未加载过,因为我得到了一个 echo “完成”和一个 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/"
}
}
}

最佳答案

要调试正在发生的事情,请打开 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

所以这是 composer 正在寻找的文件,应该包含如下内容:

namespace MyNS;

class Test { }

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

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

关于php - Composer PSR-4 自动加载 "class not found"调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53358919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com