【问题标题】:Call to undefined method Composer\\Autoload\\ClassLoader::setPsr4()调用未定义的方法 Composer\\Autoload\\ClassLoader::setPsr4()
【发布时间】:2016-01-10 21:29:48
【问题描述】:

我有一个包含多个子文件夹的项目。在其中一个文件夹中,它们是一些“插件”。所有这些插件都有一个 composer.json 和一个供应商文件夹。我现在想构建自己的插件并创建一个新文件夹并将composer.json 放入该目录。 composer install 工作没有任何问题,但是当我以某种方式安装我的插件时,我得到了错误

FastCGI: server "/fcgi-bin-php5-fpm-ezi" stderr: PHP message: PHP Fatal error:  Call to undefined method Composer\\Autoload\\ClassLoader::setPsr4()

什么可能导致这个问题?我已经做过composer dump-autoloadcomposer global update,因为我在互联网上找到了这些解决方案,但它仍然不起作用。我必须做一些特别的事情才能让它在子文件夹中工作吗?

目前这是我的 composer.json

{
  "name": "namespace/projectname-addonname",
  "autoload": {
    "psr-4": {
      "namespace1\\namespace2\\namespace3\\" : "src"
    }
  }
}

我不知道这是否有帮助,但是当我 var_dump 加载程序时,这就是结果

object(Composer\Autoload\ClassLoader)#138 (4) {
  ["prefixes":"Composer\Autoload\ClassLoader":private]=>
  array(0) {
  }
  ["fallbackDirs":"Composer\Autoload\ClassLoader":private]=>
  array(0) {
  }
  ["useIncludePath":"Composer\Autoload\ClassLoader":private]=>
  bool(false)
  ["classMap":"Composer\Autoload\ClassLoader":private]=>
  array(0) {
  }
}

之后,$loader->setPsr4 方法被调用,我得到了致命错误。

奇怪的是,当使用classmap 而不是psr-4 进行自动加载时,它可以正常工作。

【问题讨论】:

  • 你的作曲家版本是多少? composer --version 的结果是什么?
  • 我有Composer version 1.0-dev (6eb50623e6e00bac4ed893802836e50b62c83434) 2016-02-08 19:03:10 和同样的问题

标签: php composer-php autoload psr-4


【解决方案1】:
"autoload":
 {
    "psr-4":
    {
    "namespace1\\namespace2\\namespace3\\" : "src"
    },

    "classmap": ["src/"]
}

试试这个!

【讨论】:

    【解决方案2】:

    在我的情况下,代码中有多个版本的ClassLoader.php 文件存在问题。让我解释一下我的情况,我有多个带有 Composer 的 Wordpress 插件,以及它们是如何初始化的,首先需要 ClassLoader.phpcomposer/autoload_real.php 文件中的后续代码

    if ('Composer\Autoload\ClassLoader' === $class) {
      require __DIR__ . '/ClassLoader.php';
    }
    

    然后当你再次调用require __DIR__ . '/autoload.php'; 时,类已经加载并且可能有不同的接口(在我们的例子中缺少函数)。

    您可以使用反射检查它,在composer/autoload_real.php之后添加关注代码new \Composer\Autoload\ClassLoader();

    $reflector = new ReflectionClass('\\Composer\\Autoload\\ClassLoader');
    die($reflector->getFileName());
    

    在我的情况下,类是从不同的源加载的,然后是当前的工作目录。

    解决方案

    • composer self-update下载最新版作曲家
    • 然后访问您项目中所有带有composer.json 的文件夹并调用composer update
    • 然后运行 ​​composer global update 并检查是否有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2018-06-06
      • 2023-01-18
      • 2014-10-22
      • 2018-09-09
      • 2017-05-05
      相关资源
      最近更新 更多