我需要重构一个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
。然后,无论您决定现在和将来使用哪个电子邮件库,都将处于同一Emailer
DIR和命名空间不会更改,始终WhateverEmailer
。
然后在负载链上的某个文件中,您将拥有一些包装类(或服务或容器之类的东西),它将通过您的通用名称(例如$this->Emailer
)加载FunkyJoesEmailer
位于任何命名空间中。因此,在您的代码中,您将调用$this->Emailer
它将返回您正在使用的任何电子邮件(供应商)的实例。
如果您需要进行命名空间更改,甚至完全替换您使用的 Emailer 供应商,则更改位于一个地方,并且会在您的代码中产生涟漪,因为它仍然$this->Emailer
。
虽然这种方法并不能解决您现在必须更改所有内容的问题,但它确实意味着您只需要更改一次。然后将来可以替换供应商或让他们在他们的代码中进行重命名,并且您的路径(命名空间)保持不变。