人気記事

広告

記事検索

MOVION.netについて

WEB技術に関することや、気になるWEBサイトなどについて個人的なメモを残すためのブログです。

その他運営サイト

かかわっているサイト

2008年05月20日(火)

PHP5でデザインパターン・Singleton(シングルトン)編

結構よく使うSingleton。インスタンスが1個であることを保証出来る。
php4で、Singleton中途半端に実装して、newもgetInstanceも誤って使うと訳がわからなくなります。

以下ソースコード。

  1. < ?php
  2. class Singleton {
  3.     private static $singleton;
  4.     private $_name;
  5.     private function __construct() {
  6.         print "create instance<br />";
  7.     }
  8.     public static function getInstance() {
  9.         if (!is_object(Singleton::$singleton)) {
  10.             Singleton::$singleton = new Singleton();
  11.         }
  12.         return Singleton::$singleton;
  13.     }
  14.     public function setName($name) {
  15.         $this->_name = $name;
  16.     }
  17.     public function getName() {
  18.         return $this->_name;
  19.     }
  20. }
  21.  
  22. print ‘Singleton.php test start.<br />’;
  23.  
  24. $object1 = Singleton::getInstance();
  25. $object2 = Singleton::getInstance();
  26.  
  27. $object1->setName(‘akira’);
  28. print $object1->getName() . ‘<br />’;
  29. print $object2->getName() . ‘<br />’;
  30. $object2->setName(‘yoshiko’);
  31. print $object1->getName() . ‘<br />’;
  32. print $object2->getName() . ‘<br />’;
  33.  
  34. $object3 = new Singleton();
  35. print $object3->getName() . ‘<br />’;
  36.  
  37. echo ‘Singleton.php test end.<br />’;
  38. ?>

これで、$objcet1も$object2も同じインスタンスです。
$object3は生成出来ません。

で、以下結果。
———–
Singleton.php test start
create instance
akira
akira
yoshiko
yoshiko

Fatal error: Call to private Singleton::__construct() from context ” in /var/www/public_html/exsample/Singleton.php on line 34
———–

34行目でprivateになってるコンストラクタを呼び出そうとしているので、エラー(Fatal error)が発生しています。
そのため、「Singleton.php test end.」までは進みません。

今さらなネタですが、とりあえず。