我如何创建具有依赖项注入和接口的连接类?

问题描述 投票:3回答:1

我正在阅读这个问题:

PHP - multiple different databases dependency injected class

最佳答案。我在这里了解使用接口背后的概念,但是我不知道如何使用它。这是最上面的答案,如果我不应该在这里复制它,对不起:

您应该首先为所有数据库操作创建一个接口。

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

然后具有实现此接口的不同驱动程序类

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

通过这种方式,您可以轻松使用依赖项注入。

class Test
{
   private $db;

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

您可以将其称为:

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

我不理解的是如何在课堂测试中完成它以及我要传递给测试的内容。我的连接信息去哪儿了?我希望有人能帮助我完成一个mysql连接或pdo。

php class dependency-injection database-connection
1个回答
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并摆脱所有这些可能会更好,因为它是适用于许多不同数据库的出色抽象层。

© www.soinside.com 2019 - 2024. All rights reserved.