Php 在一个文件中使用两个名称空间以实现向后兼容性的最佳实践是什么?

Php 在一个文件中使用两个名称空间以实现向后兼容性的最佳实践是什么?,php,namespaces,Php,Namespaces,我需要重构一个PHP项目,在这个项目中,供应商已经经历了品牌再造。该项目目前使用名称空间OldCompany,我需要将其更改为newcommpany,但是我意识到我需要保留旧名称空间以实现向后兼容性,在现有用户正在使用try{}catch(/OldCompany/Exception$e){}的情况下。。。如果我只是将名称空间更改为newcommany,如果他们直接升级SDK版本,我将中断他们的集成。阅读后,我尝试了示例3中概述的方法,并修改了所有文件,如下所示: <? namespace

我需要重构一个PHP项目,在这个项目中,供应商已经经历了品牌再造。该项目目前使用名称空间
OldCompany
,我需要将其更改为
newcommpany
,但是我意识到我需要保留旧名称空间以实现向后兼容性,在现有用户正在使用
try{}catch(/OldCompany/Exception$e){}
的情况下。。。如果我只是将名称空间更改为
newcommany
,如果他们直接升级SDK版本,我将中断他们的集成。阅读后,我尝试了示例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 */

}

这是设置名称空间。但您的问题肯定是旧供应商名称空间已更改为新名称空间?这意味着您需要导入(
使用
)新名称空间而不是旧名称空间

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

我绝对不想重复的代码,如 文档,因为没有特定于命名空间的代码

如果没有特定于名称空间的代码,那么您试图解决什么问题

我需要保留旧的名称空间以便向后使用 兼容性,在现有用户正在使用的情况下
试试{}catch(/OldCompany/Exception$e){}

当然,不管他们最终拥有什么样的名称空间,都不会影响你这方面的事情吗?这样您就可以更新所有代码的名称空间,而不必担心它们的用途了?他们只是叫你的端点或者其他正常的东西

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

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


其他需要考虑的因素是如何管理供应商。p> 我假定您没有使用预先制作的框架,例如Symfony(它们有预先确定的管理供应商和事物的方法)

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

我建议只要有意义,就考虑把事情抽象到集中的地方。这允许对一个集中的东西进行修改,修改会自动波及到您的所有代码,而无需进行大规模重构

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

例如,应用程序中的供应商
FunkyJoesEmailer
将只是
Emailer
。那么,无论您现在和将来决定使用哪个emailer库,都将位于相同的
emailer
目录中,并且名称空间不会更改,始终是
Whatever\emailer

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

如果您曾经需要更改名称空间,或者甚至完全更换您使用的Emailer供应商,那么更改只在一个地方发生,并且会在您的代码中波动,因为它仍然是
$this->Emailer


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

保留旧名称空间并不能真正使代码具有具有新公司名称的新名称,是吗?我要么坚持旧的公司名称,要么对其进行重构。“如何”取决于您的代码库有多大,您是否有测试,以便可以更改任何内容,只需运行测试以检查是否有任何内容被破坏?@James感谢您的回复。代码库相对较小,因为它只是供应商小型RESTAPI的包装器。(约10个类/文件,约15个公开方法);我确实有测试,所以这不应该是个问题。我真的希望避免强迫用户更新他们现有的代码库,因为这需要他们额外的开发/质量保证工作。我觉得我的答案就在
use
操作符()的某个地方,但我无法从提供的导入/别名示例中了解这是否是我真正需要的。
namespace NewCompany{ /* no namespace-specific code needed */ };
namespace OldCompany{ /* no namespace-specific code needed */ };