依賴注入的觀念就是將所有東西先在「外面」準備好,然後再帶入「內部」的程式中,如此一來你就能夠在檢視程式碼的時候,一目了然地知道這個程式依賴著哪些類別。
傳統寫法
class Application { private $auth; private $session; public function __construct($db, $dbUsername, $dbPassword) { $this->auth = new Auth($db, $dbUsername, $dbPassword); $this->session = new Session(); } public function login($username, $password) { if($this->auth->validate($username, $password)) $this->session->set('username', $username); } } class Auth { private $database; public function __construct($db, $dbUsername, $dbPassword) { $this->database = new MySQL($db, $dbUsername, $dbPassword); } public function validate($username, $password) { return $this->database->where('username', $username) ->where('password', $password); } } class Session { public function set($name, $value) { $_SESSION[$name] = $value; } } $application = new Application('localhost', 'root', ''); $application->login('admin', 'admin');
當我們實作「主程式」的時候,並不知道主程式呼叫了什麼(除非我們查看主程式的原始碼)。
依賴注入寫法
class Application { private $auth; private $session; public function __construct(Auth $auth, Session $session) { $this->auth = $auth; $this->session = $session; } // ...程式... } $auth = new Auth('localhost', 'root', ''); $session = new Session(); $application = new Application($auth, $session); $application->login('admin', 'admin');
除了讓程式可閱讀性增加外,也達成了高內聚、低耦合。