【问题标题】:PHP include different version of same libraryPHP包含同一个库的不同版本
【发布时间】:2013-07-14 16:19:37
【问题描述】:

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

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

在这篇文章中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();

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

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

提前致谢

【问题讨论】:

  • new 是一个关键字,它不能像命名空间一样工作。
  • 这很棘手,因为一旦包含函数和类,它们就会在全局范围内定义。变量不是。

标签: php namespaces include version libraries


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回复 :) 我已邮寄 php 开发人员在此处解释此问题:news.php.net/php.internals/68115 然而,composer 似乎无法以任何方式解决此问题,因为我在这里说:news.php.net/php.internals/68126
猜你喜欢
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多