php - 如何在简单的 php 函数中使用 "Dependency Injection",我应该打扰吗?

标签 php dependency-injection parameter-passing

我一直听到人们谈论依赖注入(inject)和它的好处,但我并不真正理解它。

我想知道这是否是“我一直将数据库连接作为参数传递”问题的解决方案。

我尝试阅读维基百科的条目,但该示例是用 Java 编写的,所以我并不完全理解它试图阐明的区别。 (http://en.wikipedia.org/wiki/Dependency_injection)。

我阅读了这篇依赖注入(inject)在 php 中的文章 (http://www.potstuck.com/2009/01/08/php-dependency-injection/),似乎目标不是直接将依赖项传递给对象,而是在创建对象的同时封锁对象的创建它是依赖项。不过,我不确定如何在使用 php 函数的上下文中应用它。

此外,是否存在以下依赖注入(inject),我是否应该尝试在函数上下文中进行依赖注入(inject)?

第 1 版:(我每天都在创建但不喜欢的那种代码)

function get_data_from_database($database_connection){
    $data = $database_connection->query('blah');
    return $data;
}

版本 2:(不必传递数据库连接,但可能不需要依赖注入(inject)?)

function get_database_connection(){
    static $db_connection;
    if($db_connection){
        return $db_connection;
    } else {
        // create db_connection
      ...
    }
}

function get_data_from_database(){
   $conn = get_database_connection();
   $data = $conn->query('blah');
   return $data;
}

$data = get_data_from_database();

版本3:(“对象”/数据的创建是分开的,数据库代码是静止的,所以这可能算作依赖注入(inject)?)

function factory_of_data_set(){
    static $db_connection;
    $data_set = null;
    $db_connection = get_database_connection();
    $data_set = $db_connection->query('blah');
    return $data_set;
}

$data = factory_of_data_set();

任何人都有很好的资源或只是使方法和好处变得清晰的洞察力?

最佳答案

依赖注入(inject)是“我的构造函数中有更多参数”的一个大词。

这是你在可怕的 Singleton 浪潮之前不喜欢全局变量时所做的:

<?php
class User {
    private $_db;
    function __construct($db) {
        $this->_db = $db;
    }
}

$db   = new Db();
$user = new User($db);

现在,诀窍是使用单个类来管理您的依赖项,就像这样:

class DependencyContainer 
{
    private _instances = array();
    private _params = array();

    public function __construct($params)
    {
        $this->_params = $params;
    }

    public function getDb()
    {
        if (empty($this->_instances['db']) 
            || !is_a($this->_instances['db'], 'PDO')
        ) {
            $this->_instances['db'] = new PDO(
                $this->_params['dsn'],
                $this->_params['dbUser'], 
                $this->_params['dbPwd']
            );
        }
        return $this->_instances['db'];
    }
}

class User
{
    private $_db;
    public function __construct(DependencyContainer $di)
    {
         $this->_db = $di->getDb();
    }
}

$dependencies = new DependencyContainer($someParams);
$user = new User($dependencies);

你一定认为你只是另一个类并且更复杂。但是,您的用户类可能需要像许多其他类一样记录消息。只需将一个 getMessageHandler 函数添加到您的依赖容器中,并将一些 $this->_messages = $di->getMessageHandler() 添加到您的用户类中。其余代码无需更改。

您会在 symfony's doc 上获得大量信息

关于php - 如何在简单的 php 函数中使用 "Dependency Injection",我应该打扰吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255771/

相关文章:

java - 使用java中自制的打印方法打印int或double

php - 路由到 CodeIgniter 中的多个子文件夹

c++ - 是否可以在 C++ 中强制传递依赖对象的常量

java - 我的单例类中的依赖注入(inject)

dependency-injection - setter 和 getter 真的会破坏 SRP 吗?

powershell - 如何抑制用户在没有参数参数的情况下调用我的 powershell 脚本时发生的错误

c++ - 将 std::vector 作为输入/输出引用参数传递时丢失了一些数据

php - 按添加的 WHERE 条件的顺序对 SQL 输出进行排序

php - 数组作为 session 变量

php - 如何在存储到 s3 之前使用干预调整图像大小?