LoginSignup
11
11

More than 5 years have passed since last update.

PHPで使うGoFパターン ひとり Advent Calendar - シングルトン

Posted at

シングルトンってなに?

要するに割と安全なグローバル変数です。
ポイントは以下

  • コンストラクタを private にする
  • 自身を保持するprivate static な変数を作る
  • 自身を返すpublic static なメソッドを作る
<?php
class Singleton {
  // シングトンの実装 ここから << 
  private static $_Self = null;
  private function __construct () {} 
  public static function getInstance () {
     if ( !self::$_Self )self::$_Self = new Singleton();
     return self::$_Self;
  }
  // ここまで >>

  // 以下は普通に実装する
  public function doSomething ( $param ) {
  }

  public function doSomething2 ( $param ) {
  }

  public function doSomething3 ( $param ) {
  }
}

function main () {

  // こうやって呼び出して
  $obj = Singleton::getInstance ();

  // こうやって使う
  print $obj->doSomething ();
}

どういう時に使うの?

  • ロガー
  • 設定ファイル

等、システム中にひとつ居れば良いような変数をシングルトンにします。そうすると、至るところでnew しなくても良くなり、new するコストを減らすことが出来る、場合によってはデータの一貫性も取り易くなったりします。

単体テスト的にどうなの?


実は単体テストで癌になり易いです。

  • 普通には new 出来ない
  • メソッド内で気軽に直接参照され易い

等の問題があります。
結局、単体テストのために

  • 引数でオブジェクトを渡すように修正
  • コンストラクタをpublic に書き換える

など、無惨な末路を辿る結果になります。

ご利用は計画的に

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11