gpt4 book ai didi

php - 如何避免冲突用于依赖注入(inject)的 PHP 特性

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

我终于开始探索 PHP 中的特征。我想尝试的第一个地方是将配置位注入(inject)到类中。如果我使用 DIC,我可能在任何需要配置对象的类中都有这样的代码:

protected function SetConfig($config) {
$this->config = $config;
}

protected $config;

这似乎很自然地适合 traits 以避免到处都是样板代码,所以我可能会创建这个:

trait Config {
protected function SetConfig($config) {
$this->config = $config;
}

protected $config;
}

然后像这样使用它:

class Foo {
use Config;

public function __construct() {
//can now use $this->config
}
}

太好了。现在假设我想创建第二个特征,例如,用于日志记录:

trait Logger {
protected function SetLogger($logger) {
$this->logger = $logger;
}

protected $logger;
}

我可以这样使用:

class Foo {
use Logger;

public function __construct() {
//can now use $this->logger
}
}

也很棒。现在问题来了,如果这两个特征想互相使用。记录器类需要注入(inject)一个配置对象似乎很合理,这意味着这样做:

trait Logger {
use Config;

protected function SetLogger($logger) {
$this->logger = $logger;
}

protected $logger;
}

但是当另一个类同时使用这两个特征时,事情就会崩溃:

class Foo {
use Config, Logger;

public function __construct() {
//want to use $this->config and $this->logger
}
}

当然,这不起作用,因为配置位在 Foo 中有效地复制了。

我可以省略 Logger 特征中的 use Config; 部分,因为我知道它最终会出现。但这对我来说感觉很奇怪,因为它产生了一种外部依赖性。如果我想在某个还没有配置特征的地方使用 Logger 怎么办?这个解决方案还意味着我需要忍受我的 IDE (PhpStorm 8) 警告我未知方法,并且不提供自动完成功能。我意识到我可以通过使用@method 依次解决这些问题,但可以这么说,这只是给 pig 涂口红。

我也可以为 Logger 中的配置位设置别名,但这也是有问题的。

所有这些都有一点味道,但我还没有弄清楚这是因为这对我来说是一个新模式还是它真的是一个臭模式。无论哪种方式,我都不确定使这种方法真正起作用的最佳方法。

关于解决这个特征问题的最佳方法有什么建议吗?还是避免 DIC 快捷方式的特征更好?

最佳答案

我发现有用的方法是使用 getter 和 setter。然后,这允许您要求存在特定的 getter,而不会与其他特征冲突。

trait Config {
protected function SetConfig($config) {
$this->config = $config;
}

protected function GetConfig() {
return $this->config;
}

protected $config;
}

trait Logger {
abstract protected function GetConfig();

protected function SetLogger($logger) {
$this->logger = $logger;
}

protected $logger;
}

class Baz {
use Config, Logger;

// ...

}

在 Baz 中,Config trait 提供了所需的抽象方法,并且 Baz 的组合没有错误。如果您错误地只使用 Logger,您将得到一个 fatal error :Baz 类包含 1 个抽象方法,因此必须声明为抽象方法或实现其余方法 (Baz::GetConfig)

关于php - 如何避免冲突用于依赖注入(inject)的 PHP 特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26307350/

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