在单个文件中使用两个命名空间以实现向后兼容性的最佳做法是什么?



我需要重构一个PHP项目,其中供应商经历了品牌重塑。该项目目前使用命名空间OldCompany,我需要将其更改为NewCompany,但是我已经意识到我需要保留旧的命名空间以实现向后兼容性,在现有用户使用try {} catch (/OldCompany/Exception $e) {}的情况下...如果我简单地将命名空间更改为NewCompany,如果他们直接升级 SDK 版本,我将破坏他们的集成。阅读 PHP 命名空间文档后,我尝试了示例 #3 中概述的方法,并像这样修改了我的所有文件:

<?
namespace NewCompany{ /* no namespace-specific code needed */ };
namespace OldCompany{ /* no namespace-specific code needed */ };
namespace {
/* global namespace code. code that applies to both namespaces? */

require_once('file1.php');
require_once('file2.php');
/* classes and functions within the global namespace */
}

上面抛出了一个 PHP 致命异常,找不到NewCompany命名空间。

我绝对不想按照文档的示例 #2 复制代码,因为没有特定于命名空间的代码。

为现有用户保留现有的OldCompany命名空间,同时为新用户重构品牌为"NewCompany"的最佳方法是什么? 我应该寻找解决这个问题的不同解决方案吗?

提前致谢:)

namespace NewCompany{ /* no namespace-specific code needed */ };
namespace OldCompany{ /* no namespace-specific code needed */ };

这是设置命名空间。但是,您的问题是旧的供应商命名空间已更改为新的命名空间吗?这意味着您需要导入(use)新命名空间而不是旧命名空间?

也许我误解了你,但你对设置和导入命名空间之间的区别感到困惑吗?如果供应商已更改为新的命名空间,则需要导入新命名空间,而不是旧命名空间。但这与设置命名空间无关。

我绝对不想按照示例 #2 复制代码 文档,因为没有特定于命名空间的代码。

如果没有特定于命名空间的代码,那么您正在尝试解决什么问题?

我需要向后保留旧的命名空间 兼容性,在现有用户使用try {} catch (/OldCompany/Exception $e) {}.

当然,无论他们最终拥有什么命名空间,都不会影响您的方面?因此,您可以更新所有代码的命名空间,而不必担心它们使用什么?他们只是调用您的端点或正常调用什么?

如果这是一个真正的问题,也许会更具体。

在我看来,您只需要更新供应商新命名空间的导入语句。

 


要考虑的其他事项是重构管理供应商的方式。

我认为你没有使用一个预制的框架,比如Symfony(他们有预先确定的方法来管理供应商和事物)。

事实上,你正在考虑重构整个代码而不是单个配置文件(或其他文件),这让我认为你的代码存在设计缺陷。您似乎正在根据第三方公司(供应商)更改其名称来更改文件中的代码(命名空间)。 在可能的情况下,你的代码应该完全抽象到这种程度的这种变化。

我建议考虑在有意义的情况下将事物抽象到集中的地方。这允许更改一个集中的东西,并且更改会自动波及到您的所有代码,而无需进行大规模的重构。

您可以为供应商创建自己的通用名称,这样无论他们如何称呼自己,在您的代码中都无关紧要。

例如,您应用程序中的供应商FunkyJoesEmailer将只是Emailer。然后,无论您决定现在和将来使用哪个电子邮件库,都将处于同一EmailerDIR和命名空间不会更改,始终WhateverEmailer

然后在负载链上的某个文件中,您将拥有一些包装类(或服务或容器之类的东西),它将通过您的通用名称(例如$this->Emailer)加载FunkyJoesEmailer位于任何命名空间中。因此,在您的代码中,您将调用$this->Emailer它将返回您正在使用的任何电子邮件(供应商)的实例。

如果您需要进行命名空间更改,甚至完全替换您使用的 Emailer 供应商,则更改位于一个地方,并且会在您的代码中产生涟漪,因为它仍然$this->Emailer

虽然这种方法并不能解决您现在必须更改所有内容的问题,但它确实意味着您只需要更改一次。然后将来可以替换供应商或让他们在他们的代码中进行重命名,并且您的路径(命名空间)保持不变。

最新更新