togatttiのエンジニアメモ

過度な期待はしないでください.

PHPを使いながらSingletonを考えてみる

GoF本の一つのSingletonパターンについて気まぐれに調べてみた。

Singletonパターンはインスタンスの生成を一つに制限するためのパターン。

メリット

同じインスタンスは使い回したほうが無駄なコスト(インスタンスの呼び出し)がかからない。
⇔同じインスタンスが複数あってもコストがかかるだけ。

インスタンスのデータを共有して、複数のクラスから利用したいとき

Test Code(Class)

  • メモ

コンストラクタのアクセスをprivateにすることで外部から、
「new」で呼び出すことを防ぐ。

getInstanceはstatic宣言することで、その後「->」で呼び出すことを防ぐ。

getInstance内の$instcanceは唯一のインスタンスを格納する変数。
static宣言することで変数を初期化し、self::$instanceというように、
クラス内で呼び出しを可能にする。

staticのgetInstanceが宣言されたとき、__constructでidを発行している。

クラスの複製を防ぐ。

Demo

別々のインスタンスであるならば、sleep前後で取得できるidが異なるはず。
→上記のコードでfalseを返す

しかし、下記のようにidは一致する。

また、保持するインスタンス構造も全く同じ。
SingletonSampleというクラスに対して、唯一のインスタンスを保持している状態。

clone,newを用いてインスタンスを増やそうとすると、FatalErrorを吐き出す。


a SingletonSample instance was created !
instance ID : 9ebb44bd95db5753631cfbd0a1c5b8bc
$instance1->getID() === $instance2->getID() : true
$instance1 === $instance2 : true

(1)インスタンスをcloneしようとすると
Fatal error: Uncaught exception 'RuntimeException' with message 'Clone is not allowed against ' in /var/www/html/test.php:51 Stack trace: #0 /var/www/html/test.php(81): SingletonSample->__clone() #1 {main} thrown in /var/www/html/test.php on line 51

(2)インスタンスをnewしようとすると
Fatal error: Call to private SingletonSample::__construct() from context '' in /var/www/html/test.php on line 81

参照