PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのシングルトンパターンとは?デザインコンセプトと実装例をわかりやすく解説

シングルトンパターン(Singleton Pattern)は、あるクラスのインスタンスがアプリケーション内に1つしか存在しないことを保証し、そのインスタンスへアクセスするためのグローバルなアクセスポイントを提供するデザインパターンです。

このパターンを利用することで、アプリケーション全体を通じて、制御された状態で唯一のオブジェクトだけが利用されることが保証されます。また、シングルトンパターンでは、クラスを直接インスタンス化(new)することなく、その唯一のオブジェクトへ直接アクセスする手段が提供される点も大きな特徴です。

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

  • クラスのインスタンスが1つだけ生成されることを保証する
  • コンストラクタをprivateにすることで、外部からのインスタンス化を防止する
  • 静的メソッドを通じて、唯一のインスタンスへのグローバルなアクセスを提供する

コード例

<?php
   class database {
      public static $connection; // インスタンスを保持する静的プロパティ
      private function __construct(){ // privateにすることで外部からの生成を禁止
         echo "connection created";
      }
      public function connect(){ // 唯一のインスタンスを取得するメソッド
         if(!isset(self::$connection)){
            self::$connection = new database();
         }
         return self::$connection;
      }
   }
   $db = database::connect();
   $db2 = database::connect();
?>

出力結果

connection created

解説

上記の例では、シングルトンパターンに従って実装されているため、$db2に対して新しいオブジェクトは生成されません。

connect()メソッドが呼び出された際、静的プロパティ$connectionにインスタンスがまだ存在しない場合のみ、新しいdatabaseオブジェクトが作成されます。2回目の呼び出しではすでにインスタンスが存在するため、同じオブジェクトがそのまま返される仕組みです。

そのため、出力には「connection created」が1回だけ表示されます。作成されるオブジェクトは1つだけであり、そのインスタンスがアプリケーション全体で共有・利用されることになります。

シングルトンパターンの活用シーン

シングルトンパターンは、データベース接続、設定情報の管理、ログ記録など、アプリケーション全体で1つのインスタンスを共有すべき場面でよく使用されます。例えば、データベース接続をその都度新しく作成するとリソースを無駄に消費しますが、シングルトンパターンを使えば接続を1つにまとめ、効率的に管理できます。

  1. PHPのmethod_exists()関数とは?メソッドの存在確認方法をわかりやすく解説

    PHPのmethod_exists()関数は、指定したクラスやオブジェクトに特定のメソッドが存在するかどうかをチェックするための組み込み関数です。動的にメソッドを呼び出す前の存在確認など、エラーを防ぎたい場面で非常に役立ちます。基本構文method_exists(object, name_of_method)パラメータobject − チェック対象となるオブジェクトのインスタンス、またはクラス名(文字列)を指定します。name_of_method − 存在を確認したいメソッドの名前を文字列で指定します。戻り値method_name で指定されたメソッドが、対象のオブジェクト(またはクラス)に対

  2. PHPのget_object_vars()関数の使い方を徹底解説

    PHPのget_object_vars()関数は、指定されたオブジェクトが持つプロパティを取得するための関数です。オブジェクト内で定義されているプロパティを、プロパティ名をキーとした連想配列の形式で返します。 構文 get_object_vars(object) パラメータ object − プロパティを取得したいオブジェクトのインスタンスを指定します。 戻り値 get_object_vars()関数は、指定されたオブジェクトの定義済みプロパティを連想配列として返します。まだ値が代入されていないプロパティについては、NULLが返されます。 なお、この関数をクラスの外部から呼び出した場合、取