2011-02-22 55 views
1

我想开发一个php模块系统像pypi或宝石。最大的问题是班级的多版本。php多版本的类

如果存在缓存模块,并且被其他模块所依赖,则更新一天缓存模块,例如,先前版本为0.1,现在更新为0.2。依赖于此缓存模块的模块可能无法正常工作。

覆盖此问题的一种方法是限制模块无法更改api。只能添加新的方法或更改方法的内部工具。但它仍然可能会导致问题,例如:1.0工作正常,当更新到2.0时,导致未测试如此好,带来一些新的错误。

多级版本是处理这个问题的更好的方法。但似乎很难使用没有命名空间的php。或

class Cache1 {} 
class Cache2 {} 
//... 

它对于模块开发人员和用户都不那么方便。

有没有什么建议?


编辑

的情况下,数据库和验证模块都依赖缓存模块,但DB依靠缓存1.0,权威性依靠缓存2.0,原因缓存2.0添加了一些新的方法,如果他们两个模块并且都称为“类缓存”,则会出现类似“无法重新声明类缓存”的错误。如果只是更新缓存到2.0,数据库模块可能爆发(数据库模块可能只需要依靠缓存1.0,因为它只是工作)

+0

不要暗示“微软在它做得很好”,但是他们的WCF版本控制指示使用与您所提及的命名方案相同的接口。另外,PHP5现在有接口和命名空间(如果有帮助的话)(尽管你只能将版本5作为目标),(可以说)你可能应该对新项目做任何事情)。 – 2011-02-22 21:01:26

回答

0

我看到了两个解决方案,您的问题:

  1. 升级到PHP 5.3并使用命名空间(可能不是一个选项)。
  2. 写了很多单元测试(你应该这样做)。

坦率地说,单元测试应该在您的软件的新版本上工作时非常有效地使用CYA。如果有任何问题无法解决,或者新的更改只是完全打破了测试,那么您至少应该充分意识到这一点,并且能够为您的用户提供迁移指南。

0

您可能想要保留模块的元数据,包括依赖项的版本号。 我认为这是最好的解决方案,因为有很多其他原因为什么你想跟踪版本号。 此外,如果你这样做,你可以自动下载正确的(可能是旧版本)的依赖关系。

关于这种情况,我认为最初的问题是关于: 您的意思是说,如果用户安装了多个版本的模块并且不同的模块需要旧版本的模块如何处理? 我想你可能想要提供代码来包含正确版本的库,并且不包括(include_path?)其他。 您可能想要以开源的http://gembundler.com/为例。 这真是一个很好的rails依赖管理器。

0

看来核心解决方案是你需要实施一些标准的单元测试来避免这些问题。你应该使用一个版本控制系统,这样你就可以恢复到旧版本的代码文件。

所以我不知道你要完成什么,但你可以这样做:

class Cache extends Cache1 { /* empty */ } 

代码只使用Cache类,它可以很容易地切换到延长确切你想要的版本。