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

2022-08-30 10:39:04

我正在维护为PHP 5.2编写的库,我想创建PHP 5.3命名空间版本。但是,我也会保持非命名空间版本的最新状态,直到 PHP 5.3 变得如此古老,甚至 Debian stable 也会发布它;)

我有相当干净的代码,大约80个遵循命名方案的类(我当然会将它们更改为),只有很少的函数和常量(也以项目名称为前缀)。Project_Directory_Filename\Project\Directory\Filename

问题是:并行开发命名空间和非命名空间版本的最佳方法是什么?

  • 我应该只在存储库中创建分叉并继续合并分支之间的更改吗?是否存在反斜杠散布代码变得难以合并的情况?

  • 我应该编写将 5.2 版本转换为 5.3 的脚本,还是反之亦然?我应该使用PHP分词器吗? ?C 预处理器?sed

  • 有没有更好的方法来使用可用的命名空间并保持与旧版PHP的向后兼容性?


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


答案 1

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

我确实认为你会发现,当你迁移到命名空间时,你会开始“以不同的方式思考”来组织你的代码。

出于这个原因,我非常同意你的第一个解决方案。创建一个分支,并执行功能和错误修复的向后移植。

祝你好运!


答案 2

这是我之前答案的后续:

命名空间模拟代码变得非常稳定。我已经可以让symfony2工作(仍然有一些问题,但基本上)。尽管除了 之外,仍然缺少一些东西,例如所有情况下的变量命名空间解析。new $class

现在我写了一个脚本,它将递归地迭代一个目录并处理所有文件:http://github.com/nikic/prephp/blob/master/prephp/namespacePortR.php


使用说明

代码工作的要求

您的类名不得包含该字符。如果他们这样做,类名在转换时可能会变得不明确。_

代码不得重新声明命名空间中的任何全局函数或常量。因此,可以确保在编译时可以解析所有代码。

基本上,这些是代码的唯一限制。虽然我应该注意,在默认配置中,namespacePortR 不会解析诸如 ,因为它需要插入其他代码。最好稍后对此进行修补(手动或使用自动修补系统)。$className = 'Some\\NS\\Class'; new $className

配置

由于我们假设命名空间中没有重新声明任何全局函数或常量,因此必须在命名空间侦听器中设置类常量。在同一文件中,将常量设置为 。assumeGlobalSEPARATOR_

在命名空间中,端口更改配置块以满足您的需求。


PS:脚本可能会提供一个选项。这告诉它跳过第一个文件。如果已将覆盖模式设置为智能,则不需要它。?skip=intint


推荐