今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

PHPでシングルトンを利用

デザインパターンのひとつに、シングルトンパターンというものがあります。

これは、アプリケーションに対して、一度に1つしかオブジェクトのインスタンスを許可したくない場合に使うもので、例えば、アプリケーション内で1つのデータベースハンドルを使いまわす、とかそういうような用途に使えるものです。

PHPのシングルトンパターンについてググると、下記のようなサンプルが出てきます。
(若干違う場合があるかも知れませんが、大枠は同じ形のはずです。)

<?php

class Singleton
{

    /** @var object 自分自身のインタンスを保持 */
    private static $instance = null;

    /**
     * コンストラクタ
     * private なので、自分自身以外からはアクセス付加
     * (このクラス外で、$obj = new Singleton(); とすると、エラーになる)
     */
    private function __construct() {
    }

    /**
     * このクラスのインスタンスを取得する
     *
     * @return object このクラスのインスタンス
     */
    public static function get()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }

        return self::$instance;
    }

    public function message()
    {
        echo "This is Singleton Class.<br />\n";
    }
}

$obj = Singleton::get();
$obj->message();

多くのサイトで、インスタンスを取得する関数(上記では、Singleton::get())を使って取得したインスタンスを変数(上記では$obj)に代入してから、その変数を使い、操作をしています。
もちろん、これはやり方の1つなのですが、

<?php
$obj = Singleton::get();
$obj->message();

の部分は、

<?php
Singleton::get()->message();

のように書くこともできます。

このように処理した方が、わかりやすい場合もありますので、こちらの方法も覚えておきましょう。

(使う、使わないは別にしても)いろんなやり方を知っておくといいです。