加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – DI是Singleton和/或静态对象的唯一解决方案吗?

发布时间:2020-12-13 13:07:47 所属栏目:PHP教程 来源:网络整理
导读:有人告诉我,单身人士很难测试. http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/ http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/ 我被告知静态方法/对象也不好. http://misko.hevery.com/2008
有人告诉我,单身人士很难测试.

> http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
> http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

我被告知静态方法/对象也不好.

> http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/

所以基本上唯一的解决方案似乎是dependency injection.

但是……我真的不能习惯DI,举个例子:

在我的框架中,我有一个管理SQL的类.这个类(以及我的许多其他框架)使用单例Logger来记录消息(以及许多其他帮助程序).

使用DI,我的代码将转向:

global $logger; //> consider i have been instanciated it at the start of my fw

$query = new PreparedQuery($logger);
$query->prepare() etc.

现在这似乎并不太糟糕.但是考虑一个需要很多查询的页面我相信在构造函数中每次编写$logger都是非常多余的,特别是如果考虑PreparedQuery是否需要构造函数中的许多其他依赖项.

我发现避免单例的唯一解决方案是在主应用程序中使用一个方法(或只是一个简单的函数)来存储对这个辅助对象(Service Locator / Container)的每个引用,但这并不能解决隐藏的问题依赖关系

那么除了DI以外你的体验是什么样的好模式?

解:

对于每个人来说,PHPunit的创建者解释了如何解决Singleton问题(以及如何使用PHP 5.3解决静态方法测试问题)

>(单身)http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html
>(静态)http://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html

如果你问我,那很有意思.

记录通常是静态单例正常的示例.你无论如何都不需要嘲笑你的日志记录,对吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读