如果我有相同的第三方库(或类)的不同版本,它们当然具有相同的名称空间和类名。有没有办法将它们包含在避免名称冲突的同一项目中?
当我们有一个单独开发组件的模块化项目时,会发生另一个问题。因此,我们可以在自己的文件夹中包含不同的模块,包括相同的外部库文件,但是当加载模块时,我们会发生类冲突。
在本文Loading multiple versions of the same class
中用户建议使用此代码:
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();
但当然不起作用。无论如何,类都会发生冲突,因为它们被声明为gobally而不是vars。
那么..还有另一种解决方案,不是手工编辑要包含的所有库名称空间吗?
提前致谢
答案 0 :(得分:3)
这是模块化系统中非常常见的问题。在PHP中你可以尝试用非常糟糕的黑客(eval,file_get_contents,str_replace)来解决它,但是你会失去很多有用的工具支持(回溯,调试,操作代码缓存,精确的错误报告,仅举几例)。
解决这些问题的常用方法是使用某种依赖关系管理。例如。在java maven中大多数时候都使用,在scala中它是maven或sbt和php家伙会正常使用composer(从未使用过这个,所以我不能完全确定它是否好或它是否支持你需要什么。)
这些工具通常使用某种算法来检测和解决典型的版本冲突。但是,只有两个冲突的版本兼容(或者至少您使用的部分兼容)时,这才有效。他们将选择一个提供的版本,在中间选择一些版本(有时非常奇怪)或让您决定使用哪个版本。但是,当然,它们也无法解决在同一命名空间中肯定需要两个版本的问题。
一般来说,最简单的方法是始终使用公司范围内的相同库或模块版本,或至少应用程序范围。上面的工具可以帮助你。
很抱歉,没有帮助您解决具体问题,但我希望您提供的一些关键字对您有用。