現在の位置: ホーム> 最新記事一覧> PHPシングルトンパターンデザインパターン:原則と実装方法の詳細な説明

PHPシングルトンパターンデザインパターン:原則と実装方法の詳細な説明

gitbox 2025-07-02

導入

PHPのシングルトンパターンは、クラスが1つのインスタンスのみを作成できることを保証し、インスタンスを取得するためのグローバルアクセスポイントを提供することを保証する広く使用されているデザインパターンです。このパターンは通常、データベース接続、ロガーなどの共有リソースを必要とするクラスで使用されます。この記事では、Singletonモードの原則と実装方法を紹介します。

原理

シングルトンパターンの中核的なアイデアは、クラスにプライベート静的プロパティを作成して、一意のインスタンスを保存し、インスタンスを取得するためのパブリック静的方法を提供することです。インスタンスを取得する方法がどこに呼ばれていても、同じオブジェクトが常に返されます。これにより、クラスに1つのインスタンスしかないことが保証され、グローバルアクセスポイントが提供されます。

成し遂げる

通常のシングルトンモード

これは、通常のシングルトンパターンを実装する方法を示す単純なPHPコードの例です。

 class Singleton {<br>    private static $instance;<br><br>    private function __construct() {<br>        // プライベートコンストラクター,直接通過を防ぎますnewインスタンスを作成します<br>    }<br><br>    public static function getInstance() {<br>        if (!self::$instance) {<br>            self::$instance = new Singleton();<br>        }<br>        return self::$instance;<br>    }<br>}<br>$instance1 = Singleton::getInstance();<br>$instance2 = Singleton::getInstance();<br>var_dump($instance1 === $instance2); // 出力: bool(true)

この例では、Singletonクラスには、一意のインスタンスを保持するためのプライベートStaticプロパティ$インスタンスが含まれており、このインスタンスを取得するためのpublic staticメソッドgetInstance()を提供します。 $インスタンスが空の場合、新しいSingletonインスタンスが作成されます。そうしないと、既存のインスタンスが直接返されます。

スレッドセーフシングルトンモード

マルチスレッド環境でSingletonパターンを使用する場合、複数のインスタンスが作成される場合があります。これを回避するために、getInstance()メソッドにスレッドロックメカニズムを追加して、1つのスレッドのみがインスタンスを作成できるようにすることができます。以下は、スレッドセーフシングルトンパターンの実装の例です。

 class Singleton {<br>    private static $instance;<br><br>    private function __construct() {<br>        // プライベートコンストラクター,直接通過を防ぎますnewインスタンスを作成します<br>    }<br><br>    public static function getInstance() {<br>        if (!self::$instance) {<br>            $lock = true;<br>            if ($lock) {<br>                usleep(100); // ロック操作をシミュレートします<br>            }<br>            if (!self::$instance) {<br>                self::$instance = new Singleton();<br>            }<br>            $lock = false; // ロックを解放します<br>        }<br>        return self::$instance;<br>    }<br>}<br>$instance1 = Singleton::getInstance();<br>$instance2 = Singleton::getInstance();<br>var_dump($instance1 === $instance2); // 出力: bool(true)

このコードでは、ロックメカニズムをモックすることで($ lock変数を使用して)、インスタンスを作成すると、1つのスレッドのみがgetInstance()メソッドにアクセスできるため、複数のインスタンスの作成を回避できます。

要約します

シングルトンパターンは、クラスに1つのインスタンスしかないことを保証し、そのインスタンスを取得するためのグローバルアクセスポイントを提供する一般的な設計パターンです。この記事では、シングルトンモードの基本原則を紹介し、PHPで通常のシングルトンモードとスレッドセーフシングルトンモードを実装する方法を示しています。 Singletonモードを使用することにより、共有リソースを効果的に管理して、リソースの独自性と一貫性を確保できます。ただし、Singletonモードを使用する場合、コードのテスト可能性とスケーラビリティへの影響についても慎重に検討する必要があります。