Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2002/02/04

counter hits
since 1999/11/06


PHP4でデザインパターン(Singleton編)

オブジェクト指向についてはまだまだ勉強中ですが、「PHPでGoFのデザインパターンを実装したら、どんな感じになるんだろ?」と思ってしまったので、ちょっとずつやってみることにしました。

caution間違いやご意見がありましたら、遠慮なくツッコミを入れてくださいm(_"_)m

今回は、Singletonパターンです。このパターンを簡単に説明すると、「あるクラスのインスタンスが1つしか存在しないようにする」パターンで、コンストラクタを潰す(Javaではprivateにする)代わりに、インスタンスを得る(publicな)メソッドを用意します(以下のクラス図を参照)。

Singletonパターンのクラス図

以下が、サンプルコードになります。

●Singleton.php

<?php
    class Singleton
    {
        var $str_;
        /**
         * Javaでいうstaticメソッドな扱いで、参照を返すようにする。
         * でないと、作成されたオブジェクトのコピーを返してしまう
         * ため、「同一のオブジェクト」と見なされない
         */
        function &getInstance()
        {
            // 同一Requestで再度getInstance()を実行した際も、同じ
            // インスタンスが返されるようにするための「static」が
            // ポイント!
            static $singleton_;
            if ($singleton_ == null) {
                $singleton_ = new Singleton();
            }
            return $singleton_;
        }

        /**
         * 確認用のセッターとゲッター
         */
        function setString($str)
        {
            $this->str_ = $str;
        }
        function getString()
        {
            return $this->str_;
        }
    }

    /**
     * main
     */
    /**
     * インスタンス化
     * ちょっと見慣れないが、この書式を使う。
     */
    $s1 =& Singleton::getInstance();
    $s2 =& Singleton::getInstance();
    $s3 =& Singleton::getInstance();

    /**
     * オブジェクトの同一性を確認
     */
    echo "\$s1==\$s2:" . (($s1 == $s2) ? "true" : "false") . "<br>";
    echo "\$s1==\$s3:" . (($s1 == $s3) ? "true" : "false") . "<br>";
    echo "<br>";

    /**
     * あるオブジェクトを操作すると、他も影響を受けることの確認
     */
    $s1->setString("s1");
    echo "s1=" . $s1->getString() . "<br>";
    echo "s2=" . $s2->getString() . "<br>";
    echo "s3=" . $s3->getString() . "<br>";
    echo "<br>";

    $s2->setString("s2");
    echo "s1=" . $s1->getString() . "<br>";
    echo "s2=" . $s2->getString() . "<br>";
    echo "s3=" . $s3->getString() . "<br>";
    echo "<br>";

    $s3->setString("s3");
    echo "s1=" . $s1->getString() . "<br>";
    echo "s2=" . $s2->getString() . "<br>";
    echo "s3=" . $s3->getString() . "<br>";
    echo "<br>";
?>

●出力結果
$s1==$s2:true
$s1==$s3:true

s1=s1
s2=s1
s3=s1

s1=s2
s2=s2
s3=s2

s1=s3
s2=s3
s3=s3
  

PHPで実装する場合、他のデザインパターンと比べて、

  • インスタンスを返すメソッド(この場合、getInstanceメソッド)で、必ずオブジェクトの参照を返す必要がある
  • クラスで管理するインスタンスを格納する変数は、static宣言する
  • Singletonなクラスをインスタンス化する場合、newではなく、上記メソッドを使用する

のようなクセ(注意点)があります。

以前に公開したlog4pクラスにもSingletonパターンを適用しています。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2002 by Hideyuki SHIMOOKA all rights reserved.