我一直听到人们在谈论依赖注入及其带来的好处,但是我并不真正了解它。
我想知道这是否是“我一直将数据库连接作为参数传递”的解决方案。
我尝试阅读有关Wikipedia的条目,但是该示例是用Java编写的,因此我不太了解它试图阐明的区别。(http://en.wikipedia.org/wiki/Dependency_injection)。
我读了这篇php-dependency-injection-in文章(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();
任何人都有很好的资源或独到的见解可以使方法和收益清晰明了?
依赖注入是“我的构造函数中还有更多参数”的一个大词。
这是您在不喜欢Globals的可怕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()到您的用户类中。其余代码没有任何变化。
$this->_messages = $di->getMessageHandler()