【问题标题】:How to resolve class ambiguity when importing libraries to classmap?将库导入类映射时如何解决类歧义?
【发布时间】:2019-03-09 22:30:46
【问题描述】:

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

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

问题是这个库不使用继承/多态性 - 它在不同的 PHP 文件中有具有相同名称和相同方法(但这些方法的不同实现)的基类。

库/some-lib/Foo.php:

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

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

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

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

我的问题是在不修改库代码的情况下解决这个问题的方法是什么? Composer 是否为此类情况提供了任何选项,以便我可以将 Foo 类的两个版本导入到 composer 的类映射中,并在我的项目中区分这两者?

【问题讨论】:

  • 他们没有自己的namespace 吗?
  • 他们不“不使用 PSR-0/4 或任何命名空间。”
  • 这就是为什么要创建命名空间来解决您的问题。
  • 我想到了类似“对于此目录中的每个文件(递归)在 /var/ww/webroot/vendor/mylib/src/client/mysql/house.php 的文件将获得类似 Mylib\Client\ 的命名空间mysql.
  • @TobiasF。但是命名空间文件会修改库代码,这是我试图避免的事情(更新库需要再次生成这些命名空间,这对于我以外的其他人来说并不是很明显,因为他们将来可能会支持这个项目)。这是一个可能的解决方案,但正如您所见,它也有缺点。

标签: php composer-php autoload


【解决方案1】:

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

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


Composer 是否为此类情况提供了任何选项,以便我可以将两个版本的 Foo 类导入到 composer 的类映射中,并在我的项目中区分这两者?

完全限定名(对于非命名空间类来说只是类名)应该是唯一的,这是 PHP 的“限制”,Composer 自动加载器依赖它。你能得到的最好的结果是使用exclude-from-classmap 设置忽略这些类之一:

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

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

【讨论】:

  • +1 表示关于库不再活跃开发的部分,因此使一些基本更改非常可行,例如正如我在问题 cmets 中所说的那样添加命名空间。
  • @TobiasF。遗憾的是,该库仍在积极开发中(最近一次更新是上个月)。但我只是想看看如何处理这种情况。最后我决定只分叉它并使用命名空间手动修复库代码中的冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多