为什么 'composer dumpautoload -o' 修复 'Class not found' PHP 错误?

Why does 'composer dumpautoload -o' fix 'Class not found' PHP error?

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

当我 运行 composer install 安装包并显示在 vendor 文件夹中时。

项目composer.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 应该足够;我对外部包没有问题。

我在这里遗漏了什么吗?

如果 class 名称和文件名不匹配,那将导致自动加载无法工作,因为这是 PSR-4 的要求。来自 docs:

The terminating class name corresponds to a file name ending in .php. The file name MUST match the case of the terminating class name.

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

The reason -o works, is Composer creates a giant associative array where classname = filename