Olen onnellinen.

あしたもどこかで NullPointerException。資格試験とかシステム開発の記録だったりなかったり。

PHP4でシングルトン

PHP4でシングルトンなクラスの設計をしていて、サブクラスを作ってふがふが…って話が出てきた。
シングルトンってサブクラス作れないだろうと思いきや、PHP4だとコンストラクタもpublicだしサブクラス作れちゃうのでした。

  1.  <?php
  2.  
  3.  class AbstractSingle
  4.  {
  5.      var $value;
  6.  
  7.      function AbstractSingle () {}
  8.  
  9.      function & getInstance () {
  10.          static $instance;
  11.          if ($instance === NULL) {
  12.              $instance = new AbstractSingle();
  13.          }
  14.          return $instance;
  15.      }
  16.      
  17.      function setValue ($value) {
  18.          $this->value = $value;
  19.      }
  20.      
  21.      function getValue () {
  22.          return $this->value;
  23.      }
  24.  }
  25.  
  26.  class SingleA extends AbstractSingle
  27.  {
  28.      function SingleA () {
  29.          parent::AbstractSingle();
  30.      }
  31.  
  32.      function & getInstance () {
  33.          static $instance;
  34.          if ($instance === NULL) {
  35.              $instance = new SingleA();
  36.          }
  37.          return $instance;
  38.      }
  39.  }
  40.  
  41.  class SingleB extends AbstractSingle
  42.  {
  43.      function SingleB () {
  44.          parent::AbstractSingle();
  45.      }
  46.  
  47.      function & getInstance () {
  48.          static $instance;
  49.          if ($instance === NULL) {
  50.              $instance = new SingleB();
  51.          }
  52.          return $instance;
  53.      }
  54.  }
  55.  
  56.  $a =& SingleA::getInstance();
  57.  $a->setValue('A');
  58.  $b =& SingleB::getInstance();
  59.  $b->setValue('B');
  60.  
  61.  print $a->getValue();
  62.  print "\n";
  63.  print $b->getValue();
  64.  print "\n";
  65.  
  66.  $a2 =& SingleA::getInstance();
  67.  $a2->setValue('A2');
  68.  
  69.  print $a->getValue();
  70.  print "\n";
  71.  print $b->getValue();
  72.  print "\n";



▼ 実行結果
A
B
A2
B



とりあえず、こんな感じかな?
サブクラスのgetInstanceの実装はかなりイケてないんだけど、クラス名がとれないっぽいので。
う〜ん。PHP4のstaticの挙動はかなりアレだな。

このエントリーを含むはてなブックマーク | 
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
Copyright © 2008 hydra404 all rights reserved.