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

Mar*_*aio 3 php static global global-variables static-classes

很多时候我听说要避免使用静态类,因为它们会插入依赖项,这会导致代码在其他项目中无法使用,并且不允许对其进行单元测试.

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

DB::execQuery(...);
Run Code Online (Sandbox Code Playgroud)

但是这会产生依赖关系,所以让我们使DB类不是静态的,在这种情况下我们会在代码中的某个地方:

$db = new DB();
Run Code Online (Sandbox Code Playgroud)

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

$db->execQuery(...);
Run Code Online (Sandbox Code Playgroud)

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

global $db;

有办法解决这个问题吗?

一种方法可能是$db在使用它的类中注入对象,但我必须在使用它的所有类中注入它,这是荒谬的,静态类可以更快地处理并且编写更少的代码.我错过了什么吗?!

Mik*_*e B 5

可以在实例化到属性时注入$ db,然后您只需要访问此属性而不是将其传递给每个方法.

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

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

}
Run Code Online (Sandbox Code Playgroud)

除此之外,您可以考虑使用一个服务容器(也称为依赖注入容器),它可以像一个全局变量一样工作,但可以解决一些测试问题.看看其中一些相关问题

拥有DI容器可以让你在类中使用静态方法DI_Container::get('db').它看起来很像global或其他一些静态调用..但在这种情况下DI_Container包含允许在测试和其他情况下采取额外操作的特殊方法..消除全局的一些"邪恶".