【问题标题】:Autoloader resulting in class not found自动加载程序导致找不到类
【发布时间】:2018-02-14 08:18:15
【问题描述】:

我正在尝试在我的 wordpress 项目中包含一个自动加载器。更具体地说,我正在开发一个插件,其中包含我所有类的 Classes/ 目录。我希望这些类可以通过命名空间访问到我的 wordpress 项目根目录和子文件/文件夹。

我觉得我的 composer.json 应该负责自动加载器的实现,尽管我仍然收到 Class not found 致命错误。有没有其他人遇到过这个问题?我提前感谢任何建议!

这是我迄今为止尝试过的:

./composer.json

  {
        "autoload": {
            "psr-4": {
                "Classes\\": "wp-content/plugins/example-plugin/Classes"
            }
        },
        "require": {}
    }

那么……

composer install

./index.php(在 wordpress 根目录中)

require_once('./vendor/autoload.php');

$foo = new \Classes\MyService();

var_dump($foo); //Fatal error: Uncaught Error: Class 'Classes\MyService' not found
die();

./wp-content/plugins/example-plugin/Classes/MyService.php

namespace Classes;

class MyService {

【问题讨论】:

  • PSR-4 不会要求文件是./wp-content/plugins/example-plugin/Classes/Api/MyService.php(特别注意Api 目录)?
  • 嗨,Phil,感谢您的建议,我已经进行了这两项更改,现在仍然很幸运:/(见编辑)
  • 添加autoload字段后,您是否执行过dump-autoload作曲家任务?
  • 如果将require_once __DIR__ . '/wp-content/plugins/example-plugin/Classes/MyService.php'; 添加到脚本顶部会发生什么?

标签: php wordpress composer-php autoload


【解决方案1】:

是的,确实,composer 应该处理您的依赖项和自动加载。您的配置也是正确的。让我们看一下检查清单:

你的环境是这样的吗?

$ tree
.
├── composer.json
├── composer.phar
├── index.php
├── vendor
│   ├── autoload.php
│   └── composer
│       ├── autoload_classmap.php
│       ├── autoload_namespaces.php
│       ├── autoload_psr4.php
│       ├── autoload_real.php
│       ├── autoload_static.php
│       ├── ClassLoader.php
│       ├── installed.json
│       └── LICENSE
└── wp-content
    └── plugins
        └── example-plugin
            └── Classes
                └── MyService.php

你的 composer.json 是这样的吗?

$ cat composer.json
{
    "name": "my/project",
    "authors": [
        {
            "name": "My Name",
            "email": "my@na.me"
        }
    ],
    "autoload": {
       "psr-4": {
           "Classes\\": "wp-content/plugins/example-plugin/Classes"
       }
    },
    "require": {}
}

你的实现是这样的吗?

$ cat wp-content/plugins/example-plugin/Classes/MyService.php
<?php
namespace Classes;

class MyService {
}

最后,你的索引是这样的吗?

$ cat index.php
<?php

require_once('./vendor/autoload.php');

$foo = new \Classes\MyService;

var_dump($foo);

如果您对所有这些问题的回答都是“是”,那么您是否刷新了自动加载器?

$ composer dump-autoload

如果您的回答是“是”,则创建一个新目录,下载composer.phar,运行php composer.phar init,将此答案的文件复制并粘贴到该目录中,然后重试。

如果这可行,那么 diff 这个与你的实现。我的猜测是,如果你走到这一步,你有一个杂散字符——可能是 Unicode 空白——隐藏在你的一个文件中。

【讨论】:

  • 感谢您的帮助!你的建议对我有用:) 一个问题,在添加自动加载器之前,在example-plugin 目录中,我使用了诸如\GuzzleHttp\Client 之类的类,这些类由位于@ 中的单独的composer.json/autoload.php 文件链接987654331@,修复上述问题似乎破坏了现有的自动加载器,任何想法为什么会这样以及我如何能够维持现有的功能?
  • 您可以将自动加载定义移动到 api 子目录的 composer.json 中,也可以将其自动加载移动到新的 composer.json 中,或者您可以确保各自的代码路径使用正确的自动加载.php。不管怎样,最好让你的所有代码都同意使用相同的 composer.json。
  • 我很困惑。澄清一下, GuzzleHttp\Client 是 composer 安装的依赖项,而不是我编写的类。它位于 example-plugin/functions/api 内的 vendor 目录中,该目录与 api 目录本地的 composer.json 文件的位置相同。我尝试将 psr-4 定义移动到该文件但没有成功...不知道如何使 /vendor 类和私有类同时工作
  • 我明白了。所以你有一个 composer.json 文件,在 api 子目录中。您确实可以拥有自己的 PSR-4 自定义类。听起来新的自动加载条款击败了以前的定义。检查差异?
  • 是的,完全正确。我需要两者都工作,而且似乎一个占上风。这些文件被忽略,所以我没有差异。我想知道我的 composer.json 中是否可以有多个 psr 子句,一个指向类,一个指向供应商..?
猜你喜欢
  • 2016-05-06
  • 2015-07-20
  • 2019-10-24
  • 2020-01-21
  • 2015-07-31
  • 2014-05-29
  • 2013-10-18
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多