首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PSR-4不加载类

PSR-4不加载类
EN

Stack Overflow用户
提问于 2018-04-23 12:51:36
回答 1查看 659关注 0票数 1

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

代码语言:javascript
复制
<?php
  require_once __DIR__ . "/vendor/autoload.php";
  echo Craftsman\EzServer::Hello();

经过一个广泛的搜索(从字面上说是一百个网站和指南),我只能通过在我尝试使用我的包的任何项目中手动添加一个classmap来让它工作。

这是我的项目的composer.json

代码语言:javascript
复制
{
  "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

代码语言:javascript
复制
{
  "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/"
    }
  }
}

这是我的供应商dir的树:

代码语言:javascript
复制
vendor
|-finlaydag33k
  |-craftsman
    |-src
      |-EzServer.php

最后但同样重要的是,我的EzServer.php

代码语言:javascript
复制
<?php
  namespace Craftsman;

  class EzServer {
    public function Hello(){
      return "World!";
    }
  }

它正确地从Git下载,所以这似乎不是一个问题。

我运行了composer dump-autoload几百次,同时尝试尝试各种东西(更改大小写,添加斜杠,删除斜杠,更改命名空间,在不同的文件夹中移动文件等等)。所以这也不应该是个问题。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-23 20:10:29

第一件事立即进入我的视线:您正在为您的库使用package定义。

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

Composer可以非常容易地处理存储库本身。只需使用这种集成:

代码语言:javascript
复制
"repositories": [
    {
        "type": "vcs",
        "url": "https://gitlab.com/FinlayDaG33k/craftsman.git"
    }
]

这将允许Composer访问该存储库的composer.json,并使用其中提供的所有信息:包名、其他必需的包和自动加载定义。(提示:存储库名称和URL根本不定义Composer包的任何部分- Composer包名称仅由composer.json文件中的composer.json属性定义,因此Composer将在repo中的所有分支和标记中查找该文件,然后查看回购包含包“finlaydag33k/ that”的可能版本)。

关于自动加载的另一个词,基于我的comment:autoloading有几个步骤可能由于大小写不一致的名称而失败。如果您的代码使用了一个名为Ezserver的类,这个类以前没有加载过,那么自动加载程序将使用这个拼写并尝试找到匹配的文件。如果文件名为EzServer.php,并且您使用的是区分大小写的文件系统(例如Linux、MacOS),则PHP将找不到该文件。如果您使用的是不区分大小写的文件(例如Windows),PHP将找到该文件。但是,一旦您将代码部署到区分大小写的环境,它就会失败。

还请注意,PHP将处理类名大小写不敏感。因此,如果您的代码首先使用拼写EzServer (自动加载将成功),而第二次使用Ezserver时,it将不会第二次失败。类已经加载。

因此,PHP类名的不区分大小写的内部处理与使用代码、类名和搜索区分大小写的文件系统的自动标注相结合,是细微的自动加载失败的来源。

如果您可以通过使用类映射自动加载程序来修复这个问题,就会发现类似这样的问题正在起作用。这将适用于任何可能区分大小写的拼写错误,但如果可以避免,则不建议使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49981591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档