是有关“找不到类”错误的另一个问题。我可能丢失了一些东西,或者我误解了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/"
}
}
}
答案 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 { }
如果包含文件时出现问题,则意味着您必须关心三件事: