如何使用依赖项注入和接口创建连接类?

时间:2012-08-29 17:59:36

标签: php class dependency-injection database-connection

我正在读这个问题:

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。

1 个答案:

答案 0 :(得分:4)

你的连接信息将在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并摆脱所有这些,因为它是一个很好的抽象层,适用于许多不同的数据库。