2012-04-16 6 views
3

シングルトンモデルと静的モデルの違いをデータベース接続に反映させる方法については混乱します。私の友人は "静的な"クラスを作成し、それを見せてくれましたが、それがどのように静的であったかは分かりませんでした。私はデータベース接続を作成する方法のシングルトンメソッドを理解していますが、それが私の目標を満たしているかどうかはわかりません。スタティック対シングルトンクラスの動作方法(データベース)

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

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

答えて

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();の呼び出しでは、静的メソッドが使用されます。これは基本的には、コンストラクタをprivateとして宣言してオブジェクトを直接インスタンス化することを制限し、オブジェクトが既にインスタンス化されているかどうかをチェックします。 trueの場合は、すでにインスタンス化されているオブジェクトを返します。そうでなければnewを作成し、新しく作成したオブジェクトを返します。これにより、同じデータベース接続がアプリケーションから再利用されるようになります。

+0

この接続は、Webサイトに接続しているすべてのクライアント、またはこのクラスを呼び出したクライアントに対してのみ永続的に使用されるすべてのクライアントで、アプリケーション全体で使用されますか。 – MasterGberry

+0

は、アプリケーションのアーキテクチャとその使用方法によって異なります。同じクラスを何度も使用しているアプリケーションを使用している場合は、接続が再利用されます。 –

+0

だから私は 'クラスA { $ db = Database :: getInstance(); $ db-> query( "SELECT * FROM TABLE WHERE ID = 1"); } ' これは、すべてのクライアントで同じデータベース接続を使用していますか? – MasterGberry

関連する問題