【发布时间】: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