【问题标题】:Using one namespace twice in the same runtime在同一运行时使用一个命名空间两次
【发布时间】:2015-09-07 21:54:57
【问题描述】:

我有两个独立的 PHP 模块,每个模块都包含一个由 composer 创建的供应商文件夹。两个模块都使用在任何模块类被实例化之前注册的 composer 自动加载器。

每个供应商文件夹都包含不同版本的 Doctrine,因此在同一运行时,如果我从一个模块实例化任何 Doctrine 类,则从另一个模块对同一 Doctrine 类的任何后续调用都将使用第一个实例化类作为它已经被 PHP 自动加载(它具有相同的命名空间,相同的名称)。

有没有办法解决这个问题,而无需实际重命名所有命名空间并使用一个或两个不同 Doctrine 库的声明?

【问题讨论】:

  • 这引出了一个问题,为什么你需要加载 2 个教义,这只是一开始就不好。
  • "每个供应商文件夹都包含一个不同版本的 Doctrine"
  • 如果您重命名至少一个学说的所有命名空间,它可能是可能的。但是composer update 会杀了你。在 php.ini 的一个项目中不能有一个库的两个版本。更新您的一个项目,使两者都与相同的学说版本兼容,这将是一个干净的解决方案。其他一切都会很糟糕。

标签: php namespaces doctrine composer-php autoload


【解决方案1】:

不,没有办法在一个运行时使用相同类的两个版本。这与自动加载无关,它是 PHP 基础:

如果定义了一个名为“X”的类,则不会触发自动加载来再次加载它。并且不能再次手动包含它,因为这会导致错误(类和函数只能声明一次)。

尽量不要使用两个不同版本的 Doctrine。最好的解决方案是使用 Composer 本身将两个 PHP 模块添加到主应用程序中。这样,两个模块都会声明它们的依赖关系(其中包括 Doctrine),并且 Composer 会尝试加载可能的最佳版本 - 但只有一个版本。如果由于不兼容的版本限制而无法做到这一点,您将知道然后必须更新您的代码。

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多