0

現在、Database クラスという 1 つのクラスに依存する複数のクラスがあります。各クラスが機能するには、Database クラスのインスタンスが必要です。

すべての手続き型コードをオブジェクト指向コードに変換する前に、これを理解する必要があります。I 現在、プログラム全体に対して 1 つのデータベース接続があります。ただし、コードを OOP に変換するときに理解していることから、同じプログラム内ですべてのデータベース接続が開いている複数のクラスが作成されます。(これらのクラスはすべてメイン プログラム ファイルに含まれます)。

これを正しく実装するにはどうすればよいですか? 同じプログラム内で 5 つのデータベース接続を開くことは、確かに正しい方法ではないと思います。

4

3 に答える 3

0

コンストラクターに引数として指定することで、いくつかの異なるオブジェクト間でデータベース接続を共有できます。または、データベース接続を使用して他のクラスにサービスを提供するシングルトンを作成することもできます。

データベース接続をコンストラクターに渡す

class Foo {

    private $database = null;

    public function __construct(&$database) {
        $this->database = $database;
    }
}
$connection = mysql_connect(..);
$bar = new Foo($connection);

シングルトン

class DatabaseConnection {

    private static $instance = null;

    private function __construct() {
    }

    public static function &getInstance() {
        if (DatabaseConnection::$instance == null) {
            DatabaseConnection::$instance = new DatabaseConnection();
        }
        return DatabaseConnection::$instance;
    }
}

$mysql_query("...", DatabaseConnection::getInstance());

& は参照渡しを意味するため、複数の異なるファイル、クラス、または関数で使用されている場合でも、データベース オブジェクトのインスタンスは 1 つだけになります。詳細については、 http://php.net/manual/en/language.references.pass.phpを参照してください。

于 2013-03-30T06:19:17.733 に答える
0

シングルトン + アグリゲーションの使用に関する Jakobs のアドバイスは適切なアドバイスです。それに Doctrine ORM/DBAL を追加します。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html

シングルトン インスタンスを「Foo」クラス内で使用してオブジェクトに直接結合することは避け、シングルトン インスタンスをコンストラクターに渡します。このようにして、デカップリングが増え、自由度が高まります。

于 2013-03-30T06:29:35.003 に答える