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
对您的解释进行了一些修改之后,我很快注意到您的解释是正确的!谢谢