PHPはほとんど判らんけれど, こういうことではないですか?
PHP
1class single {
2 private static $singleton;//←シングルトンインスタンスを保管しておく変数
3 //private・・・singleクラス外部からのアクセスが出来ない
4 //static・・・クラスに属する変数(インスタンスごとに作られない)
5
6 //インスタンスを取得するための関数
7 public static function kansu() {
8 if(!isset(self::$singleton)) {//←シングルトンインスタンスが無ければ・・・
9 self::$singleton=new single();//←シングルトンインスタンスを作って・・・
10 }
11 return self::$singleton;//←そのシングルトンインスタンスを返す
12 }
13}
14//見た目上, 二つのインスタンスを生成しているように見えるが・・・
15$hensu1 = single::kansu();//←シングルトンインスタンスを取得
16$hensu2 = single::kansu();//←シングルトンインスタンスを取得
17
18//実際には二つの変数は同一のインスタンスを参照しているので・・・
19if($hensu1 === $hensu2) {
20 print "hensu1とhensu2は、一致する";//一致するのです
21} else {
22 print "hensuとhensu2は、一致しない";
23}
NOTE:
このままですとクラスsingle
のコンストラクタが外部に公開されたままになっていますからnew single()
を使ってしまうと・・・
PHP
1$hensu1 = single::kansu();//←シングルトンインスタンスを取得
2$hensu2 = new single();//←別のインスタンスを生成
3
4//二つの変数はそれぞれ異なるインスタンスを参照しているので・・・
5if($hensu1 === $hensu2) {
6 print "hensu1とhensu2は、一致する";
7} else {
8 print "hensuとhensu2は、一致しない";//一致しません
9}
single
クラスのコンストラクタをprivate化(外部からのnewによるインスタンス生成が出来なくなる)したほうがよりシングルトンらしくなります.
PHP
1class single {
2 private static $singleton;
3
4 //コンストラクタをプライベート化してしまう.
5 private function __construct(){}
6
7 //インスタンスを取得するための関数
8 public static function kansu() {
9 if(!isset(self::$singleton)) {
10 //ここはsingleクラス内のコードなのでコンストラクタを呼び出せる
11 self::$singleton=new single();
12 }
13 return self::$singleton;
14 }
15}
16
17$hensu1 = single::kansu();
18$hensu2 = new single();//プライベートなコンストラクタを呼び出そうとしているのでエラーとなります.
19/*
20つまり, インスタンスを入手するには, single::kansu()を呼び出さねばならず,
21single::kansuの内部ではたった一つのインスタンスしか作りませんから,
22singleクラスがシングルトンであることが保証されるのです.
23*/
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/27 12:37