假设我们有一个典型的类DB来访问数据库,如果这样的类是静态的,我们可以在我们的代码中的任何地方调用它:
DB::execQuery(...);
但是这会创建依赖关系,所以让我们使DB类不是静态的,在这种情况下我们会在代码中的某处:
$db = new DB();
然后我们可以调用我们的代码
$db->execQuery(...);
但是现在当在函数内部使用$db时,我们需要每次都像这样首先声明它
全球$db;
有办法解决这个问题吗?
一种方法可能是在使用它的类中注入$db对象,但是我必须在所有使用它的类中注入它,这是荒谬的,静态类可以更快地处理并且编写更少的代码.我错过了什么吗?!
解决方法:
可以在实例化到属性时注入$db,然后您只需要访问此属性而不是将其传递给每个方法.
class MyClass {
protected $_db; // DB Connection
public function __construct($db) {
$this->_db = $db;
}
public function foo() {
$this->_db->query('...');
}
}
除此之外,您可以考虑使用一个服务容器(也称为依赖注入容器),它可以像一个全局变量一样工作,但可以解决一些测试问题.看看其中一些相关问题
使用DI容器可以在类中使用静态方法,如DI_Container :: get(‘db’).它看起来很像全局或其他一些静态调用..但在这种情况下,DI_Container包含允许在测试和其他情况下采取额外操作的特殊方法.消除全局的一些“邪恶”.
标签:static-classes,php,global-variables,static,global
来源: https://codeday.me/bug/20190826/1729275.html