当前位置:  开发笔记 > 编程语言 > 正文

开发相同PHP代码的命名空间和非命名空间版本的策略

如何解决《开发相同PHP代码的命名空间和非命名空间版本的策略》经验,为你挑选了2个好方法。

我正在维护为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的向后兼容性?


更新:毕竟决定不使用命名空间.



1> Evert..:

我不认为预处理5.3代码这是一个好主意.如果您的代码在PHP 5.2和5.3中功能相同,除了使用命名空间而不是下划线分隔的前缀,为什么要使用命名空间?在这种情况下,为了使用命名空间,它听起来像你想要使用命名空间.

我认为你会发现,当你迁移到命名空间时,你会开始对组织你的代码有所不同.

因此,我非常同意您的第一个解决方案.创建一个fork并执行功能和错误修正的后端.

祝好运!



2> NikiC..:

这是我之前回答的后续内容:

命名空间模拟代码非常稳定.我已经可以让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文件.如果您已将覆盖模式设置为智能,则不应该需要它.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有