我得到了PHP Fatal error: Class 'sendwithus\sendwithus_php\lib\API' not found
composer.json:
{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/sendwithus_php",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
}
}
}
},
"require": {
"sendwithus/sendwithus_php": ">=1.0.3"
}, "autoload": {
"psr-0": {
"Foo\\": "src/",
"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"
}
}, "minimum-stability" : "dev"
}
test.php的:
use sendwithus\sendwithus_php\lib\API;
require_once 'vendor/autoload.php';
$api = new API('KEY');
我做错了什么?
答案 0 :(得分:6)
你的案子中有很多东西出了问题。我会尽力纠正它。
首先,我看看你需要的图书馆。它在Github上是公共的,它有一个composer.json
文件,有错误。
{
"name": "sendwithus/api",
"version": "1.0.3",
"require": {},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/sendwithus/sendwithus_php"
}
]
}
这些信息略显错误。只有名称格式正确。
调查该存储库的内容很快就会发现它不符合PSR-0,因此唯一可行的替代方法是类映射自动加载 - 这足够了,因为lib
文件夹中只有两个文件。 / p>
正确的自动加载定义是:
"autoload": {
"classmap": ["lib"]
}
有关如何构造它的详细信息在http://getcomposer.org/doc/04-schema.md#classmap中。有效地,classmap键的值是相对于应编入索引的存储库根目录的目录列表。
此处无需提及测试文件夹。使用PHPUnit,将扫描该文件夹以查找包含测试类的任何文件。测试引导程序应包含Composer生成的vendor/autoload.php
文件。
我不知道OP是否负责此存储库或可以更改它。上面的这些信息应该在存储库本身中实现,但如果它不能,它也会有用,因为它也可以进入“包”定义。
现在我们来看看提到的composer.json
OP:
{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/sendwithus_php",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
}
}
}
},
"require": {
"sendwithus/sendwithus_php": ">=1.0.3"
}, "autoload": {
"psr-0": {
"Foo\\": "src/",
"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"
}
},
"minimum-stability" : "dev"
}
“repositories”键可以包含“package”类型的对象,这些对象包含未能执行此操作的项目的所有必要信息,或者无法正确执行。正如我所提到的,自动加载在原始定义中被破坏,因此必须在此处修复:
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/api",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
},
"autoload": {
"classmap": ["lib"]
}
}
}
这将正确引用该存储库并启用自动加载。请注意,此处的名称已更改为原始名称 - 如果此库在两个不同的名称(一个在此处定义,另一个在原始存储库中)中,但使用相同的名称空间和类名称,则可能会引发问题。
现在修复了存储库信息,其他所有内容都在composer.json中正常工作。
"require": {
"sendwithus/api": "1.0.3"
},
"autoload": {
"psr-0": {
"Foo\\": "src/"
}
},
"minimum-stability" : "dev"
请注意,此处定义的自动加载仅适用于此库或应用程序。这里不要包含依赖项的自动加载!
然后我们会处理您的代码:
use sendwithus\sendwithus_php\lib\API;
require_once 'vendor/autoload.php';
$api = new API('KEY');
命名空间错误。不要使用Composer中的名称。使用您要导入的代码中的名称。这是正确的:
require_once __DIR__ . "../vendor/autoload.php";
use sendwithus\API;
$api = new API("apikey");
请注意,您无法在Composer中使用重命名更改库的命名空间。 Composer只为您下载PHP源文件,它不会更改文件中的代码。
我的最终composer.json
文件是:
{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/api",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
},
"autoload": {
"classmap": ["lib"]
}
}
}
},
"require": {
"sendwithus/api": "1.0.3",
},
"autoload": {
"psr-0": {
"Foo\\": "src/"
}
},
"minimum-stability": "dev"
}
答案 1 :(得分:1)
如果您有标准目录结构(如vendor/sendwithus/sendwithus_php/lib
中所示),则需要修改相对于该包的composer.json
的路径:
"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"
变为:
"sendwithus\\": "lib/"
查看vendor/composer/autoload_namespaces.php
哪个应该列出正在使用的路径。请注意作曲家将如何为您添加$vendorDir
,以便您的命名空间不需要引用它
我的项目中的一个例子:
'Core\\' => array($vendorDir . '/alex-patterson-webdev/core/src'),