gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:01:52 25 4
gpt4 key购买 nike

我需要重构一个 PHP 项目,其中供应商进行了品牌 reshape 。该项目当前使用命名空间 OldCompany ,我需要将其更改为 NewCompany ,但是我意识到我需要保留旧的命名空间以实现向后兼容性,在现有用户使用 try {} catch (/OldCompany/Exception $e) {} 的情况下...如果我只是将命名空间更改为 NewCompany , 如果他们直接升级 SDK 版本,我将中断他们的集成。看完PHP Namespace docs ,我尝试了示例 #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命名空间。
我绝对不想按照 docs 的示例 #2 复制代码。 ,因为没有特定于命名空间的代码。
保留 OldCompany 现有命名空间的最佳方法是什么?对于现有用户,同时为新用户重构“NewCompany”品牌?我应该为这个问题寻找不同的解决方案吗?
提前致谢 :)

最佳答案

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


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

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

I definitely do not want to duplicate code as per Example #2 of the docs, since there isn't namespace-specific code.



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

I need to keep the old namespace for backwards compatibility, in the cases where existing users are using try {} catch (/OldCompany/Exception $e) {}.



他们最终拥有的任何命名空间肯定不会影响您的事情吗?所以你可以更新你所有代码的命名空间而不用担心它们使用什么?他们只是调用你的端点或其他任何东西?

如果不知何故这是一个真正的问题,也许可以更具体地说明这一点。

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



需要考虑的另一件事是重构您管理供应商的方式。

我假设您没有使用预制的框架,例如 Symfony(它们有预先确定的管理供应商和事物的方法)。

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

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

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

例如。供应商 FunkyJoesEmailer在您的应用程序中将只是 Emailer .那么您现在和将来决定使用的任何电子邮件库都将在同一个 Emailer 中DIR 和命名空间不会改变,永远是 Whatever\Emailer .

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

如果您曾经需要更改命名空间,甚至完全更换您使用的 Emailer 供应商,那么更改就在一个地方并且会在您的代码中产生涟漪效应,因为它仍然是 $this->Emailer .

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

关于php - 在单个文件中使用两个命名空间以实现向后兼容性的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49707090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com