Я слышу, что люди говорят о внедрении зависимости и преимуществе всего этого время, но я действительно не понимаю это.
Я задаюсь вопросом, является ли это решение, "Я передаю соединения с базой данных как аргументы все время" проблема.
Я пытался читать запись Википедии на нем, но пример записан в 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();
У кого-либо есть хороший ресурс или просто понимание, которое делает метод и преимущество - совершенно-прозрачными?
Внедрение зависимостей - это громкое слово для выражения «У меня есть еще несколько параметров в моем конструкторе».
Это то, что вы делали до ужасной волны синглтонов, когда вам не нравились глобальные объекты:
<?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
Ни один из ваших примеров не похож на внедрение зависимостей, хотя первая версия является наиболее близкой. Внедрение зависимостей - это метод, используемый в объектно-ориентированном программировании, где у конструктора объекта есть аргументы для объектов службы, которые ему нужны, и эти объекты службы передаются создателем экземпляра (который может быть фабрикой, тестом или фреймворк внедрения зависимостей).
Чтобы обойти проблему «всегда передавать объект подключения», вы можете рассмотреть шаблон шаблона. Шаблон шаблона - это в основном абстрактный базовый класс с общей частью повторяющегося блока кода и абстрактные методы, позволяющие изменять экземпляры этих повторяющихся блоков кода. По сути, база - это шаблон блока кода, а абстрактные методы - это пробелы, которые нужно заполнить. Я лично использую шаблон метода шаблона для управления ресурсами базы данных в Java.
Ваш первый пример ЕСТЬ инъекция зависимости, вы вводите зависимость от объекта базы данных в функцию.
Сара сказала, что это не так, но, по ее мнению, это так, я думаю, что она думает о контейнерах инъекции зависимости, которые являются следующим уровнем: