Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dependency Injection

Rifat Nabi
December 22, 2011

Dependency Injection

Reinventing how you manage PHP classes

Rifat Nabi

December 22, 2011
Tweet

More Decks by Rifat Nabi

Other Decks in Programming

Transcript

  1. Dependency Injection means giving an object its instance variables. Really.

    That's it. - James Shore The Really Short Version
  2. class MySqlDB { private $_link; public function __construct($host, $username, $password,

    $database) { $this->_link = mysql_connect($host, $username, $password); mysql_select_db($database); } public function insert($data, $table) { array_map('mysql_real_escape_string', $data); $query = 'INSERT INTO `' . $table . '` (`' . implode('`,`', array_keys($data)) . '`)' . 'VALUES ("' . implode('","', $data) . '" )'; return mysql_query($query, $this->_link); } // ... }
  3. define('MYSQL_HOST', 'localhost'); define('MYSQL_USER', 'root'); define('MYSQL_PASS', ''); define('MYSQL_DB', 'test'); class User

    { private $_db; private $_info = array(); public function __construct() { $this->_db = new MySqlDB(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB); } public function register($name, $email, $age, $sex) { $this->_info = compact('name', 'email', 'age', 'sex'); $this->_db->insert($this->_info, 'users'); } // ... } $user = new User(); $user->register('Tasneem', '[email protected]', 18, 'female');
  4. // You can hardcode it public function __construct() { $this->_db

    = new MySqlDB('localhost', 'root', '', 'test'); } // You can configure it with an array public function __construct($config) { $this->_db = new MySqlDB($config['host'], $config['user'], $config['pass'], $config['db']); } // And, What we saw earlier public function __construct() { $this->_db = new MySqlDB(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB); } Options
  5. class User { protected $_db; protected $_info = array(); public

    function __construct() { $registry = RegistrySingleton::getInstance(); $this->_db = $registry->database; } public function register($name, $email, $age, $sex) { $this->_info = compact('name', 'email', 'age', 'sex'); $this->_db->insert($this->info, 'users'); } // ... } $user = new User(); $user->register('Tasneem', '[email protected]', 18, 'female');
  6. class User { protected $_db; protected $_info = array(); public

    function __construct($database) { $this->_db = $database; } public function register($name, $email, $age, $sex) { $this->_info = compact('name', 'email', 'age', 'sex'); $this->_db->insert($this->_info, 'users'); } // ... } $mysql = new MySqlDB('localhost', 'root', '', 'test'); $user = new User($mysql); $user->register('Tasneem', '[email protected]', 18, 'female');
  7. public function test(OtherClass $otherClass) { } public function testInterface(Interface $interface)

    { } public function testArray(array $inputArray) { } Type Hinting Since PHP 5.1
  8. interface Database { public function insert(array $data, $table); } class

    User { protected $_db; protected $_info = array(); public function __construct(Database $database) { $this->_db = $database; } public function register($name, $email, $age, $sex) { $this->_info = compact('name', 'email', 'age', 'sex'); $this->_db->insert($this->_info, 'users'); } // ... } $mysql = new MySqlDB('localhost', 'root', '', 'test'); $user = new User($mysql); $user->register('Tasneem', '[email protected]', 18, 'female');
  9. class MySqlDB implements Database { protected $_link; public function __construct($host,

    $username, $password, $database) { $this->_link = mysql_connect($host, $username, $password); mysql_select_db($database); } public function insert(array $data, $table) { array_map('mysql_real_escape_string', $data); $query = 'INSERT INTO `' . $table . '` (`' . implode('`,`', array_keys($data)) . '`)' . 'VALUES ("' . implode('","', $data) . '" )'; return mysql_query($query, $this->_link); } // ... } MySQL
  10. class MongoDB implements Database { // ... public function insert(array

    $data, $table) { // Save the passed array using MongoDB } // ... } $mongoDb = new MongoDB('localhost', 'root', '', 'test'); $user = new User($mongoDb); $user->register('Tasneem', '[email protected]', 18, 'female'); MongoDB
  11. class SQLiteDB implements Database { // ... public function insert(array

    $data, $table) { // Save the passed array using SQLite } // ... } $sqlite = new SQLiteDB('app.db', 'test'); $user = new User($sqlite); $user->register('Tasneem', '[email protected]', 18, 'female'); SQLite
  12. class TestDB implements Database { protected $_data = array(); public

    function insert(array $data, $table) { $this->_data[$table] = $data; } public function get($table) { return $this->_data[$table]; } } $fakeDb = new TestDB(); $user = new User($fakeDb); $user->register('Tasneem', '[email protected]', 18, 'female'); print_r($fakeDb->get('users')); TestDB
  13. class Container { protected $s=array(); function __set($k, $c) { $this->s[$k]=$c;

    } function __get($k) { return $this->s[$k]($this); } } Twittee A DI Container in a Tweet using the power of PHP 5.3
  14. $c = new Container(); $c->mysql = function ($c) { return

    new MySqlDB('localhost', 'root', '', 'test'); } $c->user = function ($c) { $db = $c->mysql; return new User($db); } // When you need a user $user = $c->user; // Instead of $user = new User(); Container