PHPで【シングルトン】を扱う(デザインパターン)
はじめに
オブジェクト指向プログラミングなんかで使われる設計パターンに、デザインパターンというものがあります。
数々のエンジニアが工夫を重ねてきた設計が23種類ほどあり、その中の1つがシングルトンパターンです。
データベース接続する際にこれを使うことがあったので、今回はこれについてまとめてみようと思います。
シングルトンパターンの基本概念
シングルトンパターンはソフトウェア開発において、特定のクラスのインスタンスが1つだけであることを保証するデザインパターンです。
これにより、特定のリソースや設定がグローバルに一貫して管理されることを可能にします。
このパターンは特にデータベース接続や設定ファイルの読み込み、ログの管理などで有用です。
シングルトンパターンの主な目的は以下の2つです。
1.クラスのインスタンスが一つだけであることを保証
2.この唯一のインスタンスにグローバルにアクセスできる
これを達成するために、シングルトンクラスは以下のような特徴を持ちます。
・プライベートなコンストラクタ
クラスの外部からインスタンスが作成されないようにするため。
・静的なインスタンス
クラス内で唯一のインスタンスを保持。
・静的なメソッド
インスタンスへのアクセスを提供する。
シングルトンパターンをPHPで実装
具体的にデータベース接続を例としてPHPでシングルトンパターンを実装してみます。
<?php
class Database {
// 唯一のインスタンスを保持するためのプライベート静的プロパティ
private static $instance = null;
// データベース接続を保持するプロパティ
private $connection;
// コンストラクタはプライベートにして外部からのインスタンス化を防ぐ
private function __construct() {
$host = 'localhost';
$dbname = 'my_database';
$username = 'myname';
$password = 'abc123';
try {
$this->connection = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
// 唯一のインスタンスを取得するための静的メソッド
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
// データベース接続を取得するメソッド
public function getConnection() {
return $this->connection;
}
// クローンメソッドはプライベートにしてクローン化を防ぐ
private function __clone() {}
// シリアライズメソッドはプライベートにしてシリアライズを防ぐ
private function __wakeup() {}
}
// データベース接続の取得例
$db = Database::getInstance();
$connection = $db->getConnection();
// クエリの実行例
$stmt = $connection->prepare("SELECT * FROM users");
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
echo $row['name'] . "<br>";
}
?>
ポイント
・プライベートコンストラクタ
'private function __construct()' は外部から直接インスタンス化することを防ぎます。
・静的プロパティ
'private static $instance = null'はクラス内で唯一のインスタンスを保持します。
・静的メソッド
'public static function getInstance()'は唯一のインスタンスを返すためのメソッドです。
インスタンスがまだ作成されていない場合、このメソッドは新しいインスタンスを作成し、以降はそのインスタンスを返します。
・データベース接続の管理
'private $connection'は、PDOを使ってデータベース接続を保持します。
これにより、同じ接続を複数の場所で使うことができます。
シングルトンパターンの利点
1.一貫性のあるデータ管理
例えば、データベース接続をシングルトンとして管理することで、アプリケーション全体で一貫性のある接続を行えます。
2.リソースの節約
複数のデータベース接続を開くのではなく、1つの接続を使いまわすことでリソースを節約できます。
3.グローバルアクセス
インスタンスにグローバルにアクセスできるため、コードがシンプルになります。
シングルトンパターンの注意点
1.テストの難しさ
シングルトンパターンはテストが難しい場合があります。
なぜなら、グローバルな状態を持つため、テスト間で状態が共有されてしまうことがあるからです。
2.柔軟性の欠如
シングルトンパターンを使うと、そのクラスのインスタンスは1つの限定されるので、状況によっては柔軟性が失われることがあります。
まとめ
シングルトンパターンは、特定のクラスのインスタンスが1つだけであることを保証し、グローバルにアクセスできるようにする強力なデザインパターンです。
今回紹介したデータベース接続だけでなく、多くの場面で使用でき有用ですが、使い方に注意も必要です。
適切に使用することで、コードの一貫性や効率も上がるのでぜひ身に付けたい技術です。
こういったデザインパターンが他にも色々あるので、また勉強を行っていきたいです。