php - 如何使用依赖注入(inject)和接口(interface)创建连接类?

标签 php class dependency-injection database-connection

我正在阅读这个 SO 问题:

PHP - multiple different databases dependency injected class

最佳答案。我了解这里使用接口(interface)背后的概念,但我不知道如何使用它。以下是最佳答案的内容,抱歉,如果我不应该在此处复制它:

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

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

然后有不同的驱动类实现这个接口(interface)

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

这样你就可以轻松地使用依赖注入(inject)。

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。

最佳答案

你的连接信息会放在 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 并摆脱所有这些,因为它是一个很棒的抽象层,可以与许多不同的数据库一起工作。

关于php - 如何使用依赖注入(inject)和接口(interface)创建连接类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183819/

相关文章:

wpf - 如何在 XAML 中注入(inject)转换器

c# - 为什么要在依赖注入(inject)中进行反射?

android - Dagger2 错误 : Cannot provide without @Inject constructor

php - 从外部应用程序访问 Symfony session 值

php - 为什么在并发打开的页面之间共享 PHP session 似乎在 FF 中有效,但在 IE 或 Chrome 中却无效?

c++ - 读取类变量

c++ - 将类链接到多个其他类

Python 类和方法

php - 如何将在php中创建的变量传递给mysql数据库?

php - 使用 PHP 和 Python 的客户端服务器应用程序