将库导入 classmap 时如何解决 class 歧义?

How to resolve class ambiguity when importing libraries to classmap?

我的项目中需要一个旧库,它根本不使用 PSR-0/4 或任何命名空间。它有大量 PHP 个不同 class 的文件。假设我通过 'classmap' 自动加载(如 Composer 文档所建议的那样)将此库添加到我的项目中:

"autoload": {
    "classmap": [
        "libraries/some-lib"
    ]
}

问题是这个库不使用 inheritance/polymorphism - 它在不同的 PHP 中具有相同名称和相同方法(但这些方法的不同实现)的基础 class ] 个文件。

libraries/some-lib/Foo.php:

class Foo
{
    public function bar()
    {
        ...
    }
}

libraries/some-lib/Foo-alternate.php:

class Foo
{
    public function bar()
    {
        ...
    }
}

因此,当 composer 生成它时,会为它们生成 classmap Ambiguous class resolution 警告,并且我的项目代码中只有一个版本的 Foo 可以通过 \Foo 因为名称冲突。

我的问题是如何解决这个问题而不修改库代码? Composer 是否为这种情况提供了任何选项,以便我可以将 Foo class 的两个版本导入 Composer 的 classmap 并在我的项目中区分这两个版本?

PHP 不允许两个 class 具有相同的名称,因此即使您会找到解决方法(例如根据上下文从指定文件手动加载 class ) 这将更像是脆弱的 hack 而不是真正的解决方案,并且当您尝试在同一请求中加载这两个 classes 时它将失败。

虽然你想避免修改库代码,但这实际上是最简单可靠的解决方案。进行这些更改应该很容易,我怀疑仍然没有使用 PSR-0/4 的库是否正在积极开发,因此维护 fork 应该不需要任何额外的工作。


Is there any options Composer provides for situations like this so that I can import both versions of Foo class into composer's classmap and distinguish between the two in my project as a result?

完全限定名称(对于非命名空间 classes 只是 class 名称)应该是唯一的,这是 PHP "limitation" 并且 Composer autoloader 依赖于它。最好的办法是使用 exclude-from-classmap 设置忽略其中一个 class:

"autoload": {
    "exclude-from-classmap": ["libraries/some-lib/Foo-alternate.php"]
}

然后 Composer 将仅从 libraries/some-lib/Foo.php 自动加载 class。您仍然可以手动加载秒 class (require __DIR__ . '/libraries/some-lib/Foo-alternate.php'),但您应该非常小心(如果 libraries/some-lib/Foo.php 已经加载,这将导致致命错误)。