PSR-4没有加载类

时间:2018-04-23 12:51:36

标签: composer-php

我目前正在尝试编写我的第一个Composer软件包,但我似乎无法让它正常工作。 我得到的只是:Class 'Craftsman\EzServer' not found运行以下代码时:

<?php
  require_once __DIR__ . "/vendor/autoload.php";
  echo Craftsman\EzServer::Hello();

经过广泛的搜索(字面意思是一百个网站和指南),我只能通过手动将classmap添加到我尝试使用我的软件包的任何项目中来实现它。

这是我的项目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"
  }
}

composer.json

{
  "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!";
    }
  }

它从Git repo中正确下载,所以这似乎不是问题 我尝试尝试各种各样的东西(改变套管,添加斜线,删除斜线,更改命名空间,移动不同文件夹中的文件等等),我跑了composer dump-autoload几百次,这样就不应该&# 39;也是一个问题。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

立即跳入我眼中的第一件事:你正在为你的图书馆使用package定义。

如果你能避免,不要这样做。如果你这样做,你告诉Composer不要在目标目录中查找composer.json - 你必须再次提供该文件的所有信息,包括自动加载部分。

Composer可以非常轻松地处理存储库本身。只需使用此集成:

"repositories": [
    {
        "type": "vcs",
        "url": "https://gitlab.com/FinlayDaG33k/craftsman.git"
    }
]

这将允许Composer访问此存储库的composer.json并使用其中提供的所有信息:包名称,其他所需包和自动加载定义。 (提示:存储库名称和URL根本不定义Composer包的任何部分 - Composer包名称仅由"name"文件中的composer.json属性定义 - 因此Composer将查找此在所有分支和标签的repo中存档,然后看到repo包含您的包的可能版本&#34; finlaydag33k / craftsman&#34;)。

有关自动加载的更多信息,基于我的comment:自动加载有几个步骤,由于名称不一致而可能会失败。如果您的代码使用之前未加载的名为Ezserver的类,则自动加载器将使用此拼写并尝试查找匹配的文件。如果文件名为EzServer.php,并且您使用的是区分大小写的文件系统(例如Linux,MacOS),则PHP将找不到该文件。如果您使用不区分大小写的文件(例如Windows),PHP将查找文件。但是,只要将代码部署到区分大小写的环境中,它就会失败。

另请注意,PHP会将类名称视为不区分大小写。因此,如果您的代码首先使用拼写EzServer(并且自动加载将成功),并且第二次使用Ezserver,则第二次不会失败。该类已经加载。

因此,PHP类名称的不区分大小写的内部处理与自动加载相结合,使用代码类名字面搜索区分大小写的文件系统是微妙的自动加载失败的根源。

如果您可以通过使用classmap自动加载器来解决问题,那么通常会提示这样的事情正在发挥作用。这将解决任何可能的区分大小写的拼写错误,但如果您可以避免,则不建议使用。