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
参照