gpt4 book ai didi

php - 构造函数注入(inject)——如果构造函数中没有提供,是否可以使用新的空对象?

转载 作者:可可西里 更新时间:2023-11-01 13:28:43 26 4
gpt4 key购买 nike

假设我有一堆类可以进行日志记录,所以我创建了一个记录器接口(interface)和几个实现(写入文件、标准输出、数据库等),但有时我不这样做关心记录这些消息,所以我做了一个实现,它只是忽略了所有的消息。

现在这有助于避免 if 并仅使用 $this->logger->write($message),但我仍然必须每次都注入(inject)虚拟记录器时间。

那么做这样的事情会有什么坏处:$this->logger = $logger 吗? $logger : 构造函数中的 new DummyLogger()

我通常不在构造函数中做任何工作,但这种东西似乎不太危险。

你会选择这种方式吗?

最佳答案

在回答您的问题之前,我建议您重新考虑您的 Logger 架构。记录总是一样的。您向某个地方写了一条消息。唯一不同的是 somewhere 部分,因此将您的 Logger 分成通用 Logger 和各种 Writers 是有意义的。这允许更大的灵 active ,例如,您可以使用复合模式一次写入多个记录器。

关于您的问题:通常您希望避免将依赖项硬编码到您的代码中,因为它会直接影响可测试性和可重用性,例如你的 Logger 只能与这个特定的 NullWriter 一起使用。如果您要分发 Logger,您还必须分发 Writer。

但是,假设您无论如何只会将 Logger 与整个 Writers 包一起分发,并且您还提供执行 ctor 注入(inject)的方法,我看不出有什么问题。如果需要,您仍然可以更换 Writer,所以一切都很好。

当我们谈论包间依赖时,情况有些不同。你会想避免这些,例如Database 包中的类不应依赖于 Logger 包中的类。

从 Logger 内部分配 NullWriter 的替代方法是使用 LoggerFactory 创建 Logger 和指定的 Writer,注入(inject) Writer 并返回 Logger。

关于php - 构造函数注入(inject)——如果构造函数中没有提供,是否可以使用新的空对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8324206/

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