3

シングルトン モデルと静的モデルがデータベース接続でどのように機能するかについて混乱しています。私の友人は「静的」クラスを作成して見せてくれましたが、それがどのように静的であるかについては意味がありませんでした。データベース接続を作成する方法のシングルトン方式はある程度理解していますが、それが私の目標を満たしているかどうかはわかりません。

私がやりたい主なことは、MYSQL に対して開いている接続の数を減らすことです。私は、データベースを頻繁に静かに呼び出す関数を持つクラスを持っていますが、誰かがデータベースを必要とする何かを要求するたびに新しい接続を作成する理由はありません。データベースに接続して小さなサンプルクエリを表示するシングルトンまたは静的メソッド (正しいアプローチのいずれか) を使用してこれを行うための小さなサンプルクラスを誰かが提供できますか? 大変ありがたく存じます。

そうそう、私は PHP 5.3 を使用しています :) 詳細についてはお気軽にお問い合わせください。

4

1 に答える 1

5

シングルトン デザイン パターンを使用してデータベース オブジェクトのインスタンスにアクセスする次の例を考えてみましょう (この目的は、アプリケーション全体で同じ接続を何度も再利用することです)。

class Database {

    protected static $_dbh;
    const HOST = 'localhost';
    const DATABASE = 'dbname';
    const USERNAME = 'username';
    const PASSWORD = 'password';

    //declare the constructor as private to avoid direct instantiation.   
    private function __construct() { }

    //access the database object through the getInstance method.
    public static function getInstance() {
        if(!isset($_dbh)) {
            #Connection String.
            self::$_dbh = new PDO('mysql:host='.self::HOST.';dbname='.self::DATABASE,self::USERNAME,self::PASSWORD);
            self::$_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$_dbh;
    }
}

アプリケーションのどこでもクラスを使用する必要がある場合は、このように簡単に実行できます。

require_once('database.php');
$dbh = Database::getInstance();
$sth = $dbh->query('SELECT * FROM sometable');
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

への呼び出しDatabase::getInstance();は静的メソッドを使用します。これが基本的に行うことは、コンストラクターをプライベートとして宣言することによってオブジェクトを直接インスタンス化することを制限し、代わりにオブジェクトが既にインスタンス化されているかどうかを確認することです。true の場合、既にインスタンス化されたオブジェクトを返します。そうでなければ、新しく作成し、新しく作成されたオブジェクトを返します。これにより、同じデータベース接続がアプリケーション全体で再利用されます。

于 2012-04-16T05:48:45.530 に答える