2012-08-29 83 views
3

我读这太问题:如何使用依赖注入和接口创建连接类?

PHP - multiple different databases dependency injected class

最佳解答。我理解在这里使用接口背后的概念,但我不知道如何使用它。这里是顶端回答说什么,对不起,如果我不应该在这里复制:

You should create an interface first for all the DB operations. 

    interface IDatabase 
    { 
     function connect(); 
     function query(); 
     ... 
    } 

Then have different driver classes implementing this interface 

    class MySQLDB implements IDatabase 
    { 
    } 
    class PGSQLDB implements IDatabase 
    { 
    } 

This way you can easily use dependency injection. 

    class Test 
    { 
     private $db; 

     function __construct(IDatabase $db) 
     { 
      $this->db = $db; 
     } 
    } 

You can call it as: 

    $mysqldb = new MySQLDB(); 
    $test = new Test($mysqldb); 
    or 
    $pgsqldb = new PGSQLDB(); 
    $test = new Test($pgsqldb); 

我不明白的是如何完成它的类测试什么,我经过测试。我的连接信息在哪里?我希望有人能帮我完成这个为MySQL连接或可能是Pdo。

回答

3

你的连接信息会包含在MySQLdb的类,所以你可以有这样的事情:

class MySQLDB implements IDatabase 
{ 
    private $pdo; // Holds the PDO object for our connection 

    // Or you can remove the parameters and hard code them if you want 
    public function __construct($username, $password, $database) { 
     $this->pdo = new PDO('...'); // Here is where you connect to the DB 
    } 

    public function query($sql) { 
     return $this->pdo->query($sql); // Or use prepared statments 
    } 
} 

然后你实例化它的类之外:

$db = new MySQLDB('user', 'pass', 'db'); 

并传递$db对象发送给您期望的某个课程IDatabase

$obj = new Test($db); // Dependency Injection, woo hoo! 

您也可以考虑让MySQLDB类扩展PDO类,但这是您的设计选择。

最后,你可能会更好地坚持PDO并摆脱所有这些,因为它是一个很好的抽象层,可以处理许多不同的数据库。

+0

在你最后的声明中,我正在看你在说什么,我在想,为什么我不会这样做,忘记依赖注入。对于我来说没有什么意义,不要为每个单独的连接做你所做的事情。 – johnny

+0

那么依赖注入是一种设计模式,我在谈论忘记所有这些类/接口,并且只是使用PDO,除非我误解了你的问题? – nickb

+0

仅仅使用PDO是我理解你说的。如果我了解你,我会创建一个postgres类,mysql类等。 – johnny