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)
要调试正在发生的情况,请打开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)
如果包含文件时出现问题,则意味着您必须关心三件事: