PHP 包含同一库的不同版本

Jos*_*eph 6 php namespaces version include libraries

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

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

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

用户建议使用此代码:

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();
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢

小智 3

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

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

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

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

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