【问题标题】:Why does 'composer dumpautoload -o' fix 'Class not found' PHP error?为什么'composer dumpautoload -o' 修复'Class not found' PHP 错误?
【发布时间】:2020-02-25 19:07:10
【问题描述】:

我有一个依赖于私有包的 Laravel 5.8 项目。

当我运行 composer install 时,软件包已安装并显示在供应商文件夹中。

项目作曲家.json

{
    ...
    "require": {
        "php": ">=7.0",
        "company/api-request": ">=1.0.0"
    }
    ...
}

包src/ApiRequest.php

<?php

namespace Company;

class APIRequest
{
    ...
}

包composer.json

{
    ...
    "autoload": {
        "psr-4": {
            "Company\\": "src/"
        }
    }
    ...
}

当我调用包时

\Company\APIRequest::run();

我得到了

Message: Class 'Company\APIRequest' not found

我知道 PHP 语法是正确的,因为当我运行 composer dumpautoload -o 时,错误消失了,但为什么有必要呢?

我希望composer installcomposer update 应该足够了;我对外部包没有问题。

我这里有什么遗漏吗?

【问题讨论】:

  • 正如您在外部依赖项中看到的那样,这应该有效。但事实并非如此,而且很难猜测所提供的信息有什么问题。我想您在制作一个最小示例时一定遗漏了一个关键细节。

标签: php laravel-5 dependencies composer-php autoload


【解决方案1】:

如果类名和文件名不匹配,则会导致自动加载无法正常工作,因为这是 PSR-4 的要求。来自docs

终止类名对应于以 .php 结尾的文件名。文件名必须与终止类名的大小写匹配。

如果是这种情况,composer dumpautoload -o 可能正在为您解决这个问题,请参阅this Reddit post

-o 起作用的原因是 Composer 创建了一个巨大的关联数组,其中 classname = 文件名

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 2019-10-05
    • 1970-01-01
    • 2020-05-17
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多