Как я могу использовать “Внедрение зависимости” в простых функциях php, и я должен обеспокоиться?

Я слышу, что люди говорят о внедрении зависимости и преимуществе всего этого время, но я действительно не понимаю это.

Я задаюсь вопросом, является ли это решение, "Я передаю соединения с базой данных как аргументы все время" проблема.

Я пытался читать запись Википедии на нем, но пример записан в Java, таким образом, я единогласно не понимаю различия, это пытается ясно дать понять. (http://en.wikipedia.org/wiki/Dependency_injection).

Я прочитал эту dependency-injection-in-php статью (http://www.potstuck.com/2009/01/08/php-dependency-injection/), и кажется, что цель не состоит в том, чтобы передать зависимости объекту непосредственно, но загородить создание объекта наряду с созданием он - зависимости. Я не уверен, как применить это в использовании php контекст функций, все же.

Кроме того, следующее Внедрение зависимости, и я должен потрудиться пытаться сделать внедрение зависимости в функциональном контексте?

Версия 1: (вид кода, который я создаю, но не люблю, каждый день),

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

Версия 2: (не должны передавать соединение с базой данных, но возможно не внедрение зависимости?)

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: (создание "объекта" / данные является отдельным, и код базы данных все еще, поэтому возможно, это рассчитало бы как внедрение зависимости?)

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();

У кого-либо есть хороший ресурс или просто понимание, которое делает метод и преимущество - совершенно-прозрачными?

67
задан Martijn Pieters 3 June 2013 в 05:59
поделиться

3 ответа

Внедрение зависимостей - это громкое слово для выражения «У меня есть еще несколько параметров в моем конструкторе».

Это то, что вы делали до ужасной волны синглтонов, когда вам не нравились глобальные объекты:

<?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

75
ответ дан 24 November 2019 в 14:41
поделиться

Ни один из ваших примеров не похож на внедрение зависимостей, хотя первая версия является наиболее близкой. Внедрение зависимостей - это метод, используемый в объектно-ориентированном программировании, где у конструктора объекта есть аргументы для объектов службы, которые ему нужны, и эти объекты службы передаются создателем экземпляра (который может быть фабрикой, тестом или фреймворк внедрения зависимостей).

Чтобы обойти проблему «всегда передавать объект подключения», вы можете рассмотреть шаблон шаблона. Шаблон шаблона - это в основном абстрактный базовый класс с общей частью повторяющегося блока кода и абстрактные методы, позволяющие изменять экземпляры этих повторяющихся блоков кода. По сути, база - это шаблон блока кода, а абстрактные методы - это пробелы, которые нужно заполнить. Я лично использую шаблон метода шаблона для управления ресурсами базы данных в Java.

7
ответ дан 24 November 2019 в 14:41
поделиться

Ваш первый пример ЕСТЬ инъекция зависимости, вы вводите зависимость от объекта базы данных в функцию.

Сара сказала, что это не так, но, по ее мнению, это так, я думаю, что она думает о контейнерах инъекции зависимости, которые являются следующим уровнем:

http://components.symfony-project.org/dependency-injection/trunk/book/02-Dependency-Injection-Containers

13
ответ дан 24 November 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: