Composer Autoload包含不正确的版本

时间:2016-08-19 10:43:58

标签: php wordpress widget composer-php

我试图使用composer维护一个简单的Wordpress插件的文件。插件代码使用三个文件:

  • dmg_custom_menu_widget.php - 需要类并使用Wordpress注册窗口小部件的文件
  • WP_Custom_Menu_Widget.php - 主要小部件类
  • WP_Widget_Base.php - 由WP_Custom_Menu_Widget.php
  • 延长

我使用composer来安装插件代码并获取依赖项。

如果dmg_custom_menu_widget.php使用这样的编辑器自动加载文件包含文件:

require_once 'vendor/autoload.php';

我收到致命错误:调用未定义的方法......'因为它包含了dmg-custom-menu-widget基本目录之外的另一个widget插件所使用的旧版WP_Widget_Base.php

dmg_custom_menu_widget.php使用以下文件直接包含文件:

require_once 'vendor/DMG/WP_Widget_Base/src/WP_Widget_Base.php';
require_once 'src/WP_Custom_Menu_Widget.php';

我没有错误,因为包含了正确的文件。

这是相关的文件夹结构:

plugins/
  dmg-related-pages-widget/
    vendor/
      DMG/
        WP_Widget_Base/
          src/
            WP_Widget_Base.php     <- File being included
  dmg-custom-menu-widget/
    dmg_custom_menu_widget.php     <- Calls require_once 'vendor/autoload.php'
    vendor/
      autoload.php                 <- Composer autoload file
      DMG/
        WP_Widget_Base/
          src/
            WP_Widget_Base.php     <- File that should be included

其他信息

如果删除文件夹dmg-related-pages-widget,则会包含正确的文件。

Composer.json

{
    "name"      : "DMG/WP_Custom_Menu_Widget",

    "license"   : "GPL-3.0",

    "repositories":
    [
        {
            "type": "git",
            "url": "https://dgifford@bitbucket.org/dgifford/wp_widget_base.git"
        }
    ],

    "require":
    {
        "DMG/WP_Widget_Base"    : "dev-master"
    },


    "autoload":
    {
        "classmap":
        [
            "src/WP_Custom_Menu_Widget.php"
        ]
    }
}

1 个答案:

答案 0 :(得分:1)

检查是否包含了正确的vendor/autoload.php

也许您的问题是您的工作目录是dmg-related-pages-widget,当dmg_custom_menu_widget.php包含vendor/autoload.php时,它会加载dmg-related-pages-widget中的文件而不是dmg_custom_menu_widget中的文件}。如果存在包含dmg_custom_menu_widget.php的其他脚本,则会发生这种情况。在PHP中,工作目录将默认发布PHP解释器,如果是Web服务器则为“document_root”。

要检查这是否是问题,请在chdir(__DIR__);中添加vendor/autoload.php之前添加dmg_custom_menu_widget.php。如果它有效,那么你就知道问题了。还有getcwd()函数可以帮助临时更改工作目录。

还有另一种可能性,即在vendor/autoload.php包含右dmg_custom_menu_widget.php之前,以某种方式包含了错误的vendor/autoload.php。这意味着错误的自动加载器在正确的自动加载器之前注册,并尝试首先加载类。所以首先加载错误的类。