在同一个运行时中两次使用同一个命名空间

Using one namespace twice in the same runtime

我有两个单独的 PHP 模块,每个模块都包含一个由 composer 创建的 vendor 文件夹。两个模块都使用在任何模块 class 实例化之前注册的作曲家自动加载器。

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

有没有办法在不实际重命名所有命名空间和使用一个或两个不同 Doctrine 库的声明的情况下解决这个问题?

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

如果定义了名称为 "X" 的 class,则不会触发自动加载以再次加载它。而且它不能手动包含第二次,因为这会导致错误(classes,以及函数,只能声明一次)。

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