ホームページ >バックエンド開発 >PHPチュートリアル >PHP デザイン パターンの入門 - シングルトン パターン
日常の開発プロセスでは、データベース接続など、繰り返しインスタンス化する必要のないクラスに遭遇することがよくあります。この場合、シングルトン モードが最適なソリューションです。前回のインタビューでたまたまこのモデルについて聞かれたので、今日はここでまとめてみます。
まず、最も単純なシングルトン モードの実装を見てみましょう:
<?phpclass Singleton{ static $instance; static function getInstance(){ if(is_null(self::$instance)){ self::$instance = new self(); } return self::$instance; }}$test1 = Singleton::getInstance();$test2 = Singleton::getInstance();if($test1 === $test2){ echo "是同一个对象";}else{ echo "不是同一个对象";}
しかし、このように書くだけでは、厳密な意味での真のシングルトン モードではありません。新しいオブジェクトは new キーワードを使用してインスタンス化できます。
$test1 = new Singleton();$test2 = new Singleton();実行結果は次のとおりです:
そこで、コードを少し改善し、コンストラクターのアクセス レベルを保護に設定する必要があります:
<?phpclass Singleton{ static $instance; protected function __construct(){ } static function getInstance(){ if(is_null(self::$instance)){ self::$instance = new self(); } return self::$instance; }}$test1 = new Singleton();$test2 = new Singleton();if($test1 === $test2){ echo "是同一个对象";}else{ echo "不是同一个对象";}現時点では、ユーザーが試行すると、新しいオブジェクトを作成するときに、以下のスクリーンショットに示されているエラーが報告されます:
もちろん、狡猾なユーザーは clone キーワードを使用して新しいオブジェクトのクローンを作成できます:
$test1 = Singleton::getInstance();$test2 = clone $test1;if($test1 === $test2){ echo "是同一个对象";}else{ echo "不是同一个对象";}
したがって、__clone メソッドを保護されたものとして宣言する必要もあります:
ユーザーが clone キーワードを使用して新しいオブジェクトのクローンを作成しようとすると、以下のスクリーンショットに示されているエラーが報告されます:
したがって、ある意味シングルトン パターンを実装するには、次の点に注意する必要があります。
1. コンストラクターを protected として宣言します。
2. 静的メソッドを取得するために getInstance を作成します。クラスを保存する変数
3. __clone メソッドを protected として宣言します
もちろん、実際の開発では、ほとんどの場合、単純なシングルトン モードを実装するだけで十分です (最初の例の記述方法)。
著作権声明: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。