6

如果我有相同的第三方库(或类)的不同版本,它们当然具有相同的命名空间和类名。有没有办法将它们包含在同一个项目中以避免名称冲突?

当我们有一个单独开发组件的模块化项目时,会发生此问题的另一种情况。所以我们可以有不同的模块,在它们自己的文件夹中包含相同的外部库文件,但是当模块被加载时,我们当然会发生类冲突。

在这篇文章中加载同一个类的多个版本

用户建议使用此代码:

namespace old {
   include /lib/api-1.0/library.php;
}
namespace foo {
   include /lib/api-2.0/library.php;
}

$oldlibary = new old\Library();
$newlibrary = new foo\Library();

但当然它不起作用。类无论如何都会发生冲突,因为它们被声明为全局而不是变量。

那么..是否有另一种解决方案不是手动编辑要包含的所有库的名称空间?

提前致谢

4

1 回答 1

3

这是模块化系统中非常常见的问题。在 PHP 中,您可以尝试使用非常糟糕的 hack(eval、file_get_contents、str_replace)来解决它,但是您会失去很多有用的工具支持(回溯、调试、操作码缓存、精确的错误报告,仅举几例)。

解决这些问题的常用方法是使用某种依赖管理。例如,在 java maven 中大多数时候使用,在 scala 中它是 maven 或 sbt,而 php 家伙通常会使用composer(从来没有使用过这个,所以我不完全确定它是否好用,以及它是否支持你需要的东西)。

这些工具通常有某种算法来检测和解决典型的版本冲突。但是,这仅在两个冲突版本兼容(或至少您使用的部分兼容)时才有效。他们要么选择提供的版本之一,要么选择介于两者之间的某个版本(有时非常奇怪),或者让您决定使用哪个版本。但当然,它们也无法解决您肯定需要在同一个命名空间中的两个版本的问题。

一般来说,最简单的方法是始终在公司范围内或至少在应用程序范围内使用相同的库或模块版本。上面的工具将帮助您。

抱歉,无法帮助您解决具体问题,但我希望提供的一些关键字对您有用。

于 2013-07-13T11:22:06.410 回答