我正在维护为PHP 5.2编写的库,我想创建它的PHP 5.3命名空间版本.但是,我还会保留非命名空间版本,直到PHP 5.3变得如此陈旧,即使是Debian stable也可以发布它;)
我有相当干净的代码,大约80个类遵循Project_Directory_Filename
命名方案(我\Project\Directory\Filename
当然会改变它们)和只有少数函数和常量(也以项目名称为前缀).
问题是:并行开发命名空间和非命名空间版本的最佳方法是什么?
我应该只在存储库中创建fork并继续在分支之间合并更改吗?是否存在反斜杠代码难以合并的情况?
我应该编写将5.2版本转换为5.3版本的脚本,反之亦然吗?我应该使用PHP tokenizer吗?sed
?C预处理器?
有没有更好的方法在可用的地方使用命名空间并保持与旧PHP的向后兼容性?
更新:毕竟决定不使用命名空间.
我不认为预处理5.3代码这是一个好主意.如果您的代码在PHP 5.2和5.3中功能相同,除了使用命名空间而不是下划线分隔的前缀,为什么要使用命名空间?在这种情况下,为了使用命名空间,它听起来像你想要使用命名空间.
我认为你会发现,当你迁移到命名空间时,你会开始对组织你的代码有所不同.
因此,我非常同意您的第一个解决方案.创建一个fork并执行功能和错误修正的后端.
祝好运!
这是我之前回答的后续内容:
命名空间模拟代码非常稳定.我已经可以让symfony2工作了(一些问题仍然存在,但基本上).除了可用的所有情况之外,仍有一些东西丢失,如变量名称空间分辨率new $class
.
现在我编写了一个脚本,它将递归遍历目录并处理所有文件:http://github.com/nikic/prephp/blob/master/prephp/namespacePortR.php
您的类名不得包含该_
字符.如果他们这样做,那么转换时类名可能会变得模棱两可.
您的代码不得重新声明命名空间中的任何全局函数或常量.因此,确保您的所有代码都可以在编译时解析.
基本上这些是对代码的唯一限制.虽然我应该注意,在默认配置中,namespacePortR不会解决类似的问题$className = 'Some\\NS\\Class'; new $className
,因为它需要插入额外的代码.最好在以后修补(手动修补或使用自动修补系统).
由于我们假设在名称空间中没有重新声明全局函数或常量,因此必须assumeGlobal
在名称空间侦听器中设置类常量.在同一个文件中将SEPARATOR
常量设置为_
.
在namespacePortR中更改配置块以满足您的需求.
PS:脚本可能会提供一个?skip=int
选项.这告诉它跳过第一个int
文件.如果您已将覆盖模式设置为智能,则不应该需要它.