まずは Singleton パターン。
Singleton パターン(シングルトン・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。/via wikipedia一つ間違えばグローバルと化すしろもの。
でも結構便利なので、グローバルとして使っちゃうかも・・・・。
カプセル化してるからいいじゃん・・・・・っていう言い訳・・・。
<?php class Singleton { private static $_instance = null; public static function getInstance() { if (null === self::$_instance) { self::$_instance = new self(); } return self::$_instance; } final private function __construct() { } final public function __clone() { throw new Exception('複製できないよ。'); } } $a = Singleton::getInstance(); $b = Singleton::getInstance(); if ($a === $b) { echo '同じ'; } else { echo '違う'; } echo '
'; try { $d = clone $a; } catch (Exception $e) { echo $e->getMessage(); } $c = new Singleton();
シングルトンは基本的にこんな感じになると思う。
実験環境が PHP5.2.6 なので静的遅延束縛が出来ないので。
ってか、この「静的遅延束縛」って言葉かっこいい。中2病が疼く。
とりあえずの実装としては、コンストラクタを private に。
コンストラクタと__clone() をfinalにする。
上のスクリプトの実行結果も
”同じ”と”複製できないよ”ってでるし、
最後の new してるとこも Fatal error: Call to private Singleton::__construct()
になって。ちゃんといい感じ。
Ubuntu の apt-get で入れられる PHP が 5.3 になったら、
静的遅延束縛バージョンも作ってみようかと思う。