php - 自动加载器导致找不到类

标签 php wordpress composer-php autoload

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

我觉得我的composer.json 应该负责自动加载器的实现,尽管我仍然收到“类未找到” fatal error 。还有其他人遇到过这个问题吗?我很感谢提前提出的任何建议!

这是我到目前为止尝试过的:

./composer.json

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

然后...

Composer 安装

./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 {

最佳答案

是的,确实, Composer 应该照顾你的依赖关系和自动加载。您的配置也是正确的。让我们看一下检查 list :

你的环境是这样的吗?

$ 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": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="08657148666926656d" rel="noreferrer noopener nofollow">[email protected]</a>"
        }
    ],
    "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);

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

$ composer dump-autoload

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

如果有效,则将其与您的实现进行diff。我的猜测是,如果您走到这一步,您的某个文件中可能隐藏着一个杂散字符(可能是 Unicode 空白)。

关于php - 自动加载器导致找不到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46065076/

相关文章:

php - 在 while 循环中运行 mysql

php - 一些图像/GD 问题 : cropping, 设置颜色和透明度

php - 我想要一个容器处理多个请求吗?

wordpress - WooCommerce REST API - 使用后/前参数获取订单

css - 网站页面挤压影响文本框架

php - 不使用 Composer 手动安装 Yii2 扩展

基于嵌套 if 语句的 PHP 邮件重定向 header 位置

php - 在此上下文中,元素 li 不允许作为元素 div 的子元素。 (抑制来自该子树的更多错误。)

PHP 未捕获错误 : Class not found using composer autoload

php - Composer 需要在 JSON 中保存补丁版本