[写経] PHPで学ぶデザインパターン02
|— 注意 —
PHPによるデザインパターンの写経ですが、まんま書くと問題があるのでアウトプットとして備忘録メモです
初心者には分かりやすくて良い本なので、是非本屋でチェックして下さい。
URL : http://www.amazon.co.jp/PHPによるデザインパターン入門-下岡-秀幸/dp/4798015164
PHPによるデザインパターン入門
Singleton(シングルトン)で共有化
生成 + オブジェクト
アプリケーションの管理や設定ファイル、DBオブジェクトなど各クラスで共有するときに毎回newするのではなく、同一のオブジェクトを再利用するためのパターンです。
Singletonの作成
コンストラクタが外部から呼び出されるとSingletonにならないので、private宣言にしましょう。
また、オブジェクトがcloneされるとまずいので__clone呼び出し時に例外を投げるようにしてます。
継承されても良いようにfinal宣言にしましょう。
/* Singletonクラス */ class Singleton{ //自分自身をキャッシュする変数 private static $self; //生成された時間 private $time; //コンストラクタ(外部から呼び出せないようにprivateにする) private function __construct() { $this->time = date("Y/m/d H:i:s"); } //Sigletonクラスの生成と取得 public static function getSingleton() { if(empty(self::$self)){ self::$self = new self(); print "Singletonを生成しました!\r\n"; } return self::$self; } //複製を禁止する(継承されてもエラーにするようにfinalで宣言する) public final function __clone() { throw new RuntimeException ("複製したらダメだよ!!"); } //デバック用 public function printCreateTime() { print "{$this->time}に生成されました\r\n"; } }
使ってみる
シングルトンで取得したオブジェクトが同じかチェックしてみましょう。
/* 使ってみる */ $sigleton_1 = Singleton::getSingleton(); $sigleton_1->printCreateTime(); sleep(3); //わざと遅らせる $sigleton_2 = Singleton::getSingleton(); $sigleton_2->printCreateTime();
$php singleton.php 2014/02/17 12:15:26に生成されました 2014/02/17 12:15:26に生成されました
エラーも確認しましょう。
1.コンストラクタ呼び出し
$sigleton_3 = new Singleton();
$php singleton.php Fatal error: Call to private Singleton::__construct() from invalid context in..
2.clone呼び出し
$sigleton_4 = clone $sigleton_1;
$php singleton.php Fatal error: Uncaught exception 'RuntimeException' with message '複製したらダメだよ!!' in ..
なんてこと無いですね。