Php 调用未定义的方法编写器\\Autoload\\ClassLoader::setPsr4()

Php 调用未定义的方法编写器\\Autoload\\ClassLoader::setPsr4(),php,composer-php,autoload,psr-4,Php,Composer Php,Autoload,Psr 4,我有一个有多个子文件夹的项目。在其中一个文件夹中,它们是一些“插件”。所有这些插件都有一个composer.json和一个供应商文件夹。我现在想构建自己的插件,创建一个新文件夹,并将composer.json放入该目录composer安装工作时没有任何问题,但是当我以某种方式安装我的插件时,我得到了错误 FastCGI: server "/fcgi-bin-php5-fpm-ezi" stderr: PHP message: PHP Fatal error: Call to undefined

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

FastCGI: server "/fcgi-bin-php5-fpm-ezi" stderr: PHP message: PHP Fatal error:  Call to undefined method Composer\\Autoload\\ClassLoader::setPsr4()
什么会导致这个问题?我已经做了
composer dump autoload
composer global update
,因为我在互联网上找到了这些解决方案,但仍然不起作用。我是否必须做一些特殊的事情才能在子文件夹中工作

这是我当前的composer.json

{
  "name": "namespace/projectname-addonname",
  "autoload": {
    "psr-4": {
      "namespace1\\namespace2\\namespace3\\" : "src"
    }
  }
}
我不知道这是否有帮助,但当我
var\u 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
进行自动加载时,它可以正常工作

"autoload":
 {
    "psr-4":
    {
    "namespace1\\namespace2\\namespace3\\" : "src"
    },

    "classmap": ["src/"]
}

试试这个

在我的例子中,代码中的多个版本的
ClassLoader.php
文件存在问题。让我来解释一下我的情况,我有多个内置Composer的Wordpress插件,它们是如何初始化的,首先需要
ClassLoader.php
Composer/autoload\u real.php
文件中的follow code

if ('Composer\Autoload\ClassLoader' === $class) {
  require __DIR__ . '/ClassLoader.php';
}
然后,当您再次调用
require\uuuuuu DIR\uuuuuuu时/autoload.php'类已经加载,并且可能具有不同的接口(在本例中缺少函数)

您可以使用反射进行检查,在
new\composer\autoload\ClassLoader()之后将以下代码添加到
composer/autoload\u real.php

在我的例子中,类是从不同的源加载的,而不是从当前的工作目录加载的。

解决方案

  • 使用
    composer自我更新下载最新版本的composer
  • 然后使用项目中的
    composer.json
    访问所有文件夹,并调用
    composer update
  • 然后运行
    composer全局更新
    ,检查是否有帮助

你的作曲版本是什么?
composer--version
的结果是什么?我有
composer版本1.0-dev(6eb50623e6e00bac4ed893802836e50b62c83434)2016-02-08 19:03:10
和同样的问题
$reflector = new ReflectionClass('\\Composer\\Autoload\\ClassLoader');
die($reflector->getFileName());