我有两个独立的PHP模块,每个模块都包含一个由composer创建的供应商文件夹。两个模块都使用在实例化任何模块类之前注册的composer自动加载器。
每个供应商文件夹包含不同版本的Doctrine,因此在同一运行时,如果我从一个模块实例化任何Doctrine类,则从另一个模块对同一个Doctrine类的任何后续调用将使用第一个实例化的类,因为它已经由PHP自动加载(它具有相同的命名空间,同名)。
有没有办法绕过这个而不实际重命名所有名称空间并使用一个或两个不同Doctrine库的声明?
答案 0 :(得分:1)
不,在一个运行时中无法使用相同类的两个版本。这与自动加载无关,它是PHP的基础:
如果定义了一个名为“X”的类,则不会触发自动加载以再次加载它。并且它不能手动第二次包含,因为这会导致错误(类和函数只能声明一次)。
尽量不要使用两个不同版本的Doctrine。最好的解决方案是使用Composer本身将PHP模块添加到主应用程序中。这样,两个模块都会声明它们的依赖关系(其中包括Doctrine),而Composer会尝试加载最好的版本 - 但只有一个版本。如果由于版本限制不兼容而无法做到这一点,您将知道然后必须更新代码。