Composer php PSR-4未加载类
我目前正试图写我的第一个作曲家软件包,但我似乎无法让它正常工作。 我得到的结果是:Composer php PSR-4未加载类,composer-php,Composer Php,我目前正试图写我的第一个作曲家软件包,但我似乎无法让它正常工作。 我得到的结果是:运行以下代码时未找到Class'crafter\EzServer': <?php require_once __DIR__ . "/vendor/autoload.php"; echo Craftsman\EzServer::Hello(); 以及包的composer.json: { "repositories": [ { "type": "package", "
运行以下代码时未找到Class'crafter\EzServer'
:
<?php
require_once __DIR__ . "/vendor/autoload.php";
echo Craftsman\EzServer::Hello();
以及包的composer.json
:
{
"repositories": [
{
"type": "package",
"package": {
"name": "finlaydag33k/craftsman",
"version": "dev-master",
"type": "library",
"source": {
"url": "https://gitlab.com/FinlayDaG33k/craftsman.git",
"type": "git",
"reference": "master"
}
}
}
],
"require":{
"predis/predis": "dev-master",
"finlaydag33k/craftsman": "dev-master"
}
}
{
"name": "finlaydag33k/craftsman",
"description": "",
"type": "library",
"license": "FinlayDaG33k License",
"authors": [
{
"name": "Aroop 'FinlayDaG33k' Roelofs",
"email": "me@finlaydag33k.nl"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=7.0.0"
},
"autoload":{
"psr-4":{
"Craftsman\\": "src/"
}
}
}
这是我的供应商目录树:
vendor
|-finlaydag33k
|-craftsman
|-src
|-EzServer.php
最后但并非最不重要的是,我的EzServer.php
:
<?php
namespace Craftsman;
class EzServer {
public function Hello(){
return "World!";
}
}
我第一眼看到的是:您正在为您的库使用包定义
如果可以避免,就不要这样做。如果这样做,您会告诉Composer不要在目标目录中查找Composer.json
,并且您必须再次提供此文件的所有信息,包括自动加载部分
Composer可以非常轻松地处理存储库本身。只需使用此集成:
"repositories": [
{
"type": "vcs",
"url": "https://gitlab.com/FinlayDaG33k/craftsman.git"
}
]
这将允许Composer访问此存储库的Composer.json
,并使用其中提供的所有信息:包名、其他必需的包和自动加载定义。(提示:存储库名称和URL根本不定义Composer包的任何部分-Composer包名称仅由名称定义)composer.json文件中的
属性-因此composer将在repo中的所有分支和标记中查找此文件,然后查看repo是否包含包“finlaydag33k/crafter”的可能版本
根据我的观点,关于自动加载还有一个问题:由于名称大小写不一致,自动加载有几个步骤可能会失败。如果您的代码使用名为Ezserver
的类,该类以前从未加载过,则自动加载程序将使用此拼写并尝试查找匹配的文件。如果文件名为EzServer.php
,并且您使用的是区分大小写的文件系统(例如Linux、MacOS),php将找不到该文件。如果您使用的是不区分大小写的文件(例如Windows),PHP将查找该文件。但一旦您将代码部署到区分大小写的环境中,它就会失败
还要注意的是,PHP将对类名不区分大小写。因此,如果您的代码第一次使用拼写EzServer
(自动加载将成功),第二次使用EzServer
,则第二次不会失败。该类已加载
因此,PHP类名的不区分大小写的内部处理与自动加载相结合,自动加载按字面意思使用代码类名并搜索区分大小写的文件系统,这是微妙的自动加载失败的根源
一个通用的提示是,如果您可以通过使用类映射自动加载程序来修复这个问题,那么类似的事情正在起作用。这将解决任何可能的区分大小写的拼写错误,但如果可以避免,则不建议使用。啊,我现在明白了。在围绕composer.json
对您的解释进行了一些修改之后,我很快注意到您的解释是正确的!谢谢