3

私はこのSOの質問を読んでいました:

PHP - 複数の異なるデータベースの依存関係が注入されたクラス

トップの答え。ここでインターフェイスを使用する背後にある概念は理解していますが、その使用方法がわかりません。一番上の回答は次のとおりです。ここにコピーすることになっていない場合は申し訳ありません。

すべての DB 操作に対して、最初にインターフェースを作成する必要があります。

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のためにこれを完了するのを手伝ってくれることを望んでいました.

4

1 に答える 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オブジェクトをクラスの 1 つに渡しますIDatabase

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

MySQLDB クラスで PDO クラスを拡張することも検討できますが、それは設計上の選択です。

最後に、PDO は多くの異なるデータベースで機能する優れた抽象化レイヤーであるため、PDO に固執し、これらすべてを取り除く方がよい場合があります。

于 2012-08-29T18:04:15.450 に答える