多个包含相同类的模块

时间:2015-12-08 12:43:49

标签: php

所以我需要在我的项目中包含模块化代码/库,一个新库:

图书馆A

a.php: class A;

图书馆B :(从A中检出v1.0)

b.php: include_once a.php; class B extends A;

图书馆C :(从A中检出v2.0)

c.php: include_once a.php; class C extends A;

图书馆D

d.php: include_once b.php,c.php;

这显然会导致名称冲突(cannot redeclare A)。

我无法触及任何一个库,因为它们经常从其他地方拉出来。另外,我需要将结果作为另一个库,因此嵌套的命名空间不是一个选项。但我想必须有很多其他项目同样的问题?感谢您的任何建议。

3 个答案:

答案 0 :(得分:0)

您可以使用require_onceinclude_once代替include

这些可能会影响性能,因为必须使用内存和处理来跟踪包含的类并检查它,但这是最简单的解决方案。他们做了多少,取决于单页加载中包含/ require_once的数量。

更复杂的会实现类自动加载器,但你可能不想去那里......

编辑 -

如果我理解你的问题,这是一个依赖性问题。库B和C都引用A,但每个引用的是不同版本的A.如果是这种情况,解决方案并非易事:任何使用require_once或include_once都将导致未确定的第一个加载版本的A被使用。任何使用include都会导致类重复。我不认为你可以通过使用这些功能来解决问题。您需要做的是管理库依赖项。

例如,自动加载器可识别类库的多个版本并加载最新版本(假设您在各版本之间保持向后兼容性)。您还可以尝试使用嵌套类,以保持每个库的依赖关系孤立和自包含。

答案 1 :(得分:0)

如果每个版本的文件名不同,您可以检查是否已经声明了一个类。 例如:

if (!class_exists('A')) {
    include a-XX.php;
}

请注意,这样您只能加载一个版本的类。

答案 2 :(得分:0)

如果我理解你的话

你的问题是那个

库B和C包含相同的文件,即A

你想要B和C在D中的另一个B和C具有相同的文件 这是A所以它显示

  

致命错误:无法在

中重新声明A类

好的---> 在文件 c.php b.php d.php include_once 'a.php'; require_once 'a.php';