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在使用它的类中注入对象,但我必须在使用它的所有类中注入它,这是荒谬的,静态类可以更快地处理并且编写更少的代码.我错过了什么吗?!
可以在实例化到属性时注入$ 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包含允许在测试和其他情况下采取额外操作的特殊方法..消除全局的一些"邪恶".
| 归档时间: |
|
| 查看次数: |
1591 次 |
| 最近记录: |