Singleton


Singleton



これは、アプリケーション内にインスタンスが1つしか存在しないことを強制するモードです.
実際にいつ使えますか?
アプリケーションのDBには1つの接続しか存在しません.(ただし、Webなどのマルチスレッド環境では、競争性の問題を考慮する必要がある.)
また...アプリケーションのトピックがページごとに異なるわけではない場合は、1つの設定がすべてのページに影響を与えるため、単一の色調を使用できます.
しかしclass自体が再利用性を考慮した文法であるのに,どうして可能なのか.
classには大きなメモリ容量が2つあります.
1つの場所はclassとして作成されたすべてのインスタンスが参照できるメモリ領域(静的)です.
もう1つはclassによって作成されたインスタンスに個別に割り当てられたメモリ領域です.
各インスタンスには共有された汎用メモリ領域があります.
ここでは静的空間静的変数と呼ぶ.
通常、instanceはnew演算子に遭遇し、他の変数に割り当てられ、独立したメモリ領域を有します.
しかし,Singletonはそのクラスの静的変数にinstanceを変態的に割り当てる.

functionが再帰的に呼び出すことができるように、classは自分の内部に自分のインスタンスを作成することもできます。


私は私が馬鹿かどうか全然知らない.クラスで自分のinstanceを置くことができるかどうか.
ではclassは外部でnew演算子に遭遇しなくても使えますか?
そうですね.
classの静的変数自体は呼び出すことができるので、インスタンスを作成することなく静的空間にアクセスできます.
クラス名::静的変数名;
クラス名::静的メソッド();
しかし、実際にはphpのようなサーバ側でsingletonを使用できることは多くありません.
  • 共有リソースアクセス
  • 複数のシステムから1つのリソースにアクセスするとき
  • 一意のオブジェクトが必要な場合
  • 値のキャッシュが必要な場合:
  • class Config
    {
        private static $Instance = NULL; // 참조체
        
        private function __construct()
        {
            // 생성자를 비어둔다. 객체 생성을 막는다.
        }
        
        private __clone()
        {
            // 복제 방지
        }
        
        public static function getInstance()
        {
            if(!isset(self::$Instance)){ // static 변수는 self로 접근한다.
                self::Instance = new self();
            }
    
            return self::Instance;
        }
    }
    
    $obj = Config::getInstance();
    $obj = Config::getInstance();
    $obj = Config::getInstance();
    
    // 모든 $obj는 한 곳의 메모리 공간을 공유한다.
    // 이미 생성되어진 instance를 반환받기 때문이다.
    

    短所


    PHPのようなマルチスレッド環境では、単一のオブジェクトの作成は保証されません.したがって、単一のオブジェクトの作成を同時に要求すると、競合が発生します.同じメモリに同時にアクセスすることを指します.競合の問題により、2つのオブジェクトが生成される可能性があります.
    このように初例が間違っている.
    PHP開発でPDO関連のエラーに遭遇したことがある.
    どんなにコードを修正しても、同じエラーが発生しました.
    apacheを再起動してメモリを解放しようとします.
    PDOはsingletonを使用できませんか?
    起動時に単一のセクションを前処理する必要があります.これは、後ですべての開発が完了した後に最適化する必要がある場合があります.