Singleton を作ってみる
毎回最適化ばっかりだと、飽きてきたので、GoFパターンの実装も練習してみる。
まずは Singleton パターン。
でも結構便利なので、グローバルとして使っちゃうかも・・・・。
カプセル化してるからいいじゃん・・・・・っていう言い訳・・・。
シングルトンは基本的にこんな感じになると思う。
実験環境が PHP5.2.6 なので静的遅延束縛が出来ないので。
ってか、この「静的遅延束縛」って言葉かっこいい。中2病が疼く。
とりあえずの実装としては、コンストラクタを private に。
コンストラクタと__clone() をfinalにする。
上のスクリプトの実行結果も
”同じ”と”複製できないよ”ってでるし、
最後の new してるとこも Fatal error: Call to private Singleton::__construct()
になって。ちゃんといい感じ。
Ubuntu の apt-get で入れられる PHP が 5.3 になったら、
静的遅延束縛バージョンも作ってみようかと思う。
まずは Singleton パターン。
Singleton パターン(シングルトン・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。/via wikipedia一つ間違えばグローバルと化すしろもの。
でも結構便利なので、グローバルとして使っちゃうかも・・・・。
カプセル化してるからいいじゃん・・・・・っていう言い訳・・・。
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 になったら、
静的遅延束縛バージョンも作ってみようかと思う。