シングルトンパターン(Singleton)をPHPで使う

シングルトンパターン database
スポンサーリンク
スポンサーリンク

オブジェクト指向プログラミングなんかで使われる設計パターンに、デザインパターンというものがあります。

数々のエンジニアが工夫を重ねてきた設計が23種類ほどあり、その中の1つにシングルトンパターンというデザインパターンがあります。

データベース接続する際などに使うシングルトンパターンについて、今回はまとめていきます。

シングルトンパターンの基本概念

シングルトンパターンは、ソフトウェア開発において、特定のクラスのインスタンスが1つだけであることを保証するデザインパターンです。

これにより、特定のリソースや設定がグローバルに一貫して管理されることを可能にします。

このパターンは特にデータベース接続や設定ファイルの読み込み、ログの管理などで有用です。

シングルトンパターンの目的

シングルトンパターンの目的としては以下のようなものが挙げられます。

  • クラスのインスタンスが一つだけであることを保証
  • この唯一のインスタンスにグローバルにアクセスできる

シングルトンパターンの特徴

目的を達成するために、シングルトンクラスは以下のような特徴を持ちます。

プライベートなコンストラクタ
クラスの外部からインスタンスが作成されないようにするため。

静的なインスタンス
クラス内で唯一のインスタンスを保持。

静的なメソッド
インスタンスへのアクセスを提供する。

シングルトンパターンを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>";
}
?>

ポイント

1.プライベートコンストラクタ
‘private function __construct()’ は外部から直接インスタンス化することを防ぎます。

2.静的プロパティ
‘private static $instance = null’はクラス内で唯一のインスタンスを保持します。

3.静的メソッド
‘public static function getInstance()’は唯一のインスタンスを返すためのメソッドです。
インスタンスがまだ作成されていない場合、このメソッドは新しいインスタンスを作成し、以降はそのインスタンスを返します。

4.データベース接続の管理
‘private $connection’は、PDOを使ってデータベース接続を保持します。
これにより、同じ接続を複数の場所で使うことができます。

シングルトンパターンの利点

シングルトンパターンの利点は以下のような点が挙げられます。

一貫性のあるデータ管理

例えば、データベース接続をシングルトンとして管理することで、アプリケーション全体で一貫性のある接続を行えます。

リソースの節約

複数のデータベース接続を開くのではなく、1つの接続を使いまわすことでリソースを節約できます。

グローバルアクセス

インスタンスにグローバルにアクセスできるため、コードがシンプルになります。

注意点

テストの難しさ

シングルトンパターンはテストが難しい場合があります。

なぜなら、グローバルな状態を持つため、テスト間で状態が共有されてしまうことがあるからです。 

柔軟性の欠如

シングルトンパターンを使うと、そのクラスのインスタンスは1つの限定されるので、状況によっては柔軟性が失われることがあります。

まとめ

シングルトンパターンは、特定のクラスのインスタンスが1つだけであることを保証し、グローバルにアクセスできるようにする強力なデザインパターンです。

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

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

こういったデザインパターンが他にも色々あるので、別の記事で紹介します。

PHPのクラスについてさらに詳しく知りたい方はこちら。

PHPのクラスについて
クラスは一言で言うと、オブジェクトを作成するための設計図のようなものです。クラスにはプロパティ(変数)とメソッド(関数)が含まれており、プロパティはオブジェクトのデータを保持、メソッドはそのデータを操作するための機能を提供します。
スポンサーリンク
スポンサーリンク
databaseprogrammingsecurity
お猿SEをフォローする
タイトルとURLをコピーしました