は、データベース・オブジェクトのインスタンスにアクセスするためにシングルトンデザインパターンを使用する次の例を考える。(これの目的は、アプリケーション全体を通して何度も同じ接続を再利用することである)
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を作成し、新しく作成したオブジェクトを返します。これにより、同じデータベース接続がアプリケーションから再利用されるようになります。
この接続は、Webサイトに接続しているすべてのクライアント、またはこのクラスを呼び出したクライアントに対してのみ永続的に使用されるすべてのクライアントで、アプリケーション全体で使用されますか。 – MasterGberry
は、アプリケーションのアーキテクチャとその使用方法によって異なります。同じクラスを何度も使用しているアプリケーションを使用している場合は、接続が再利用されます。 –
だから私は 'クラスA { $ db = Database :: getInstance(); $ db-> query( "SELECT * FROM TABLE WHERE ID = 1"); } ' これは、すべてのクライアントで同じデータベース接続を使用していますか? – MasterGberry