我需要重构一个PHP项目,其中供应商已经经历了一个重新品牌。该项目当前使用命名空间OldCompany
,我需要将其更改为NewCompany
,但是我已经意识到我需要保留旧命名空间以便在现有用户使用的情况下向后兼容{ {1}} ...如果我只是将命名空间更改为try {} catch (/OldCompany/Exception $e) {}
,如果他们直接升级SDK版本,我将打破他们的集成。阅读PHP Namespace docs后,我尝试了示例#3中概述的方法,并修改了我的所有文件:
NewCompany
以上引发了PHP致命异常,无法找到<?
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 */
}
命名空间。
我绝对不希望按照docs的示例#2重复代码,因为没有特定于命名空间的代码。
为新用户重构“NewCompany”的重新品牌时,为现有用户保留NewCompany
的现有命名空间的最佳方法是什么?我应该为这个问题寻找不同的解决方案吗?
提前致谢:)
答案 0 :(得分:1)
namespace NewCompany{ /* no namespace-specific code needed */ }; namespace OldCompany{ /* no namespace-specific code needed */ };
这是设置命名空间。但肯定你的问题是旧的供应商命名空间已经改为新的?这意味着您需要导入(use
)新命名空间而不是旧命名空间?
也许我误解了你,但你是否对设置和导入命名空间之间的区别感到困惑?如果供应商已更改为新的命名空间,则需要导入新的命名空间,而不是旧的命名空间。但这与设置命名空间无关。
我绝对不想按照示例#2重复代码 docs,因为没有特定于命名空间的代码。
如果没有特定于命名空间的代码,那么您要解决的问题是什么?
我需要保留旧命名空间以备后退 兼容性,在现有用户使用的情况下
try {} catch (/OldCompany/Exception $e) {}
。
当然,他们最终的名称空间不会影响你的一面吗?因此,您可以更新所有代码的命名空间,而不用担心它们使用的是什么?他们只是呼叫你的端点或其他正常情况?
如果这是一个真正的问题,也许更具体一点。
听起来我只需更新供应商新命名空间的import语句。
要考虑的其他因素是重构您如何管理供应商。
我认为你没有使用预制框架,例如Symfony(他们有预定的方法来管理供应商和事物)。
您正在考虑在整个代码中重构而不是单个配置文件(或其他)的事实让我觉得您的代码存在设计缺陷。因为您似乎正在更改类文件中的代码(命名空间),这是基于第三方公司(供应商)更改其名称。在可能的情况下,您的代码应完全从这种程度的变化中抽象出来。
我建议在有意义的时候考虑将事情抽象到集中的地方。这允许更改一个集中式事物,并且更改只是自动波动到您的所有代码,而无需任何巨大的重构。
您可以为您的供应商制作自己的通用名称,因此无论他们称自己在您的代码中无关紧要。
E.g。您应用中的供应商FunkyJoesEmailer
将只是Emailer
。然后您决定现在和将来使用的哪个电子邮件库将在同一个Emailer
DIR中,名称空间不会更改,始终为Whatever\Emailer
。
然后在高负载链的某个文件中,您将拥有一些包装类(或服务或容器之类的东西),它将通过您的通用名称加载FunkyJoesEmailer
在任何名称空间中,例如{{ 1}}。因此,在您的代码中,您将调用$this->Emailer
,这将返回您正在使用的任何电子邮件(供应商)的实例。
如果您需要更改命名空间或甚至完全更换您使用的电子邮件供应商,则更改位于一个位置,并且会在您的代码中降低,因为它仍然是$this->Emailer
。
虽然这种方法无法解决您现在必须更改的所有问题,但这确实意味着您只需要更改一次。那么将来可以只更换供应商或让他们的代码重命名,并且你的路径(命名空间)保持不变。