Nasıl "Bağımlılık Enjeksiyon" basit fonksiyonlar, kullanabilir miyim ve seni rahatsız etmiş olur muyum?
İnsanlar bağımlılık enjeksiyon hakkında konuşuyor ve her zaman yararı duydum, ama gerçekten anlamıyorum.
Eğer bir çözüm "bağımsız olarak veritabanı bağlantıları geçiyorum her zaman" sorun. bunu merak ediyorum
Üzerinde wikipedia girdisini okumaya çalıştım ama örnek sağlam açıklığa kavuşturmak için çalışıyor farkı anlamıyorum yani Java ile yazılmış. ( http://en.wikipedia.org/wiki/Dependency_injection ).
Okudum Bu bağımlılık-enjeksiyon-php makale ( http://www.potstuck.com/2009/01/08/php-dependency-injection/ ), ve bu gibi görünüyor hedefi olduğu için değil geçmek bağımlılıkları için bir nesneyi doğrudan, ama kordona yaratılışın bir nesne ile birlikte yaratılış bağımlılıklarını. Kullanarak php fonksiyonları bir bağlamda, ama uygulamak için nasıl emin değilim.
Ayrıca, aşağıdaki Bağımlılık Enjeksiyon ve bağımlılık enjeksiyon yapmaya çalışan işlevsel bir bağlam içinde seni rahatsız etmiş olur muyum?
Sürüm 1: oluşturmak, ama her gün gibi) yok (kod
function get_data_from_database($database_connection){
$data = $database_connection->query('blah');
return $data;
}
Sürüm 2: (veritabanı bağlantısı geçmek yok, ama belki de bağımlılık enjeksiyon değil mi?)
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();
Sürüm 3: ("oluşturulması/veri ayrı ve veritabanı kodu hala, belki de bu bağımlılık enjeksiyon?) olarak sayılır mı yani"nesne
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();
Herkes iyi bir kaynak var ya da sadece yöntem ve fayda -kristal berraklığında yapar bu fikir?
CEVAP
Bağımlılık enjeksiyon büyük bir söz "benim kurucu olarak biraz daha fazla parametre var".
Global gibi ne awfull Tek dalga önce yaptığın şey :
<?php
class User {
private $_db;
function __construct($db) {
$this->_db = $db;
}
}
$db = new Db();
$user = new User($db);
Şimdi, püf bağımlılıkları, böyle bir şey yönetmek için tek bir sınıfı kullanmak için :
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);
Sen sadece başka bir sınıf ve daha karmaşık düşünmek gerekir. Ancak, kullanıcı bir sınıf diğer sınıfları çok mesajlar günlük gerekebilir. Sadece bağımlılık kap ve $this->_messages = $di->getMessageHandler()
kullanıcı için bazı sınıf için getMessageHandler bir fonksiyonu ekleyin. Hiçbir şey kodunuzun geri kalanı değiştirmek için.
symfony's doc bilgi çok olsun
Nasıl&; Bobby Tablolar" quot; xkcd...
Nasıl değişmez bir " baskı miyim;{}&qu...
Nasıl "reddedildi" " mes...
Nasıl "yorum-out" bir toplu ...
Nasıl açık birden fazla dosya "Py...