gpt4 book ai didi

PHP 避免静态类以避免依赖,但我需要在任何地方使用全局

转载 作者:可可西里 更新时间:2023-11-01 00:35:09 25 4
gpt4 key购买 nike

很多次我听说要避免静态类因为they will insert dependencies that will render your code unusable in other projects, and will not allow to unit test it .

假设我们有一个典型的 class DB 来访问数据库,如果这样的类是 static 我们可以在我们的代码中的任何地方调用它:

DB::execQuery(...);

但是这会产生依赖性,所以让我们让 DB 类不是静态的,在这种情况下我们的代码中会有某处:

$db = new DB();

然后我们可以调用我们的代码

$db->execQuery(...);

但是现在当在 function 中使用 $db 时,我们每次都需要首先像这样声明它

全局 $db;

有没有办法解决这个问题?

一种方法是将 $db 对象注入(inject)到使用它的类中,但我必须将它注入(inject)到所有使用它的类中,这太可笑了,一个静态类就太多了使用起来更快,编写的代码更少。我错过了什么吗?!

最佳答案

$db 可以在实例化时注入(inject)到一个属性中,然后您只需要访问这个属性而不是将它传递给每个方法。

class MyClass {
protected $_db; // DB Connection
public function __construct($db) {
$this->_db = $db;
}

public function foo() {
$this->_db->query('...');
}

}

除此之外,您还可以考虑拥有一个服务容器(又名依赖注入(inject)容器),它试图像全局变量一样工作,但可以解决一些测试问题。看看其中的一些相关问题

有了 DI 容器,您就可以在类中使用静态方法,例如 DI_Container::get('db')。它看起来很像 global 或其他一些静态调用。但在这种情况下 DI_Container 包含允许在测试和其他情况下执行额外操作的特殊方法.. 消除全局的一些“邪恶”。

关于PHP 避免静态类以避免依赖,但我需要在任何地方使用全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10486107/

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