シングルトンパターン(Singleton)を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つだけであることを保証し、グローバルにアクセスできるようにする強力なデザインパターンです。

今回紹介したデータベース接続だけでなく、多くの場面で使用でき有用ですが、使い方に注意も必要です。

適切に使用することで、コードの一貫性や効率も上がるのでぜひ身に付けたい技術です。

こういったデザインパターンが他にも色々あるので、また勉強を行っていきたいです。

コメント

  1. […] […]

タイトルとURLをコピーしました