[ PHP ] シングルトンクラスの典型的な実装サンプル

Pocket

ここでは、オブジェクト指向のデザインパターンの1つであるシングルトンクラスの PHP による実装サンプルを掲載しています。

シングルトンクラスは、あるクラスのインスタンスが1つしかないことを保障します。PHP に限らずオブジェクト指向言語で開発する上で、必須の前提知識です。実装方法もプログラミング言語問わず非常に似ています。

スポンサーリンク

シングルトンクラスの実装サンプル

本サンプルは PHP におけるシングルトンクラスの典型的な実装サンプルです。詳細はコメントを参照ください。また、目的に合わせて修正して使用してください。

// final キーワードで派生クラスの生成を禁ずる
final class CountrySingleton
{
    // 唯一のインスタンスを保持する
    private static $_instance;

    private $_country = 'japan';

    // コンストラクタ
    // CountrySingleton クラスインスタンスの生成は外部から禁止
    private function __construct() { }

    // __clone マジックメソッド
    // CountrySingleton クラスのクローンは外部から禁止
    private function __clone() { }

    /*
     * 常に同じインスタンスを返す。
     * 外部からインスタンスを取得する唯一の方法を提供する
     */
    final public static function getInstance(){
        if(is_null(self::$_instance)){
            self::$_instance = new self;
        }
        return self::$_instance;
    }

    // 国名を設定する
    public function setCountry($country)
    {
        $this->_country = $country;
    }

    // 国名を取得する
    public function getCountry()
    {
        return $this->_country;
    }
}

シングルトンクラスの使用例

上記で示したシングルトンクラスの使用サンプルです。

// インスタンスの取得
$country = CountrySingleton::getInstance();
// 国名の設定
$country->setCountry('canada');
// 国名の取得
$name = $country->getCountry();

エラーとなるパターン

上記のシングルトンクラスのサンプルのエラーとなるパターンは次の通りです。

エラー1:シングルトンクラスのインスタンス生成

コンストラクタが private で修飾されているため外部からインスタンスの生成はできません。

// インスタンスの生成を行う 
$country = new CountrySingleton(); // Fatal error 

// Fatal error: Call to private CountrySingleton::__construct() from invalid context in ・・・

エラー2:派生クラスの生成

シングルトンクラスに final キーワードが付けられているため、派生クラスを作成することはできません。

// 派生クラスの生成
class ChildCountrySingleton extends CountrySingleton {
    public function __construct() { }
}

$child = new ChildCountrySingleton(); // Fatal error

// Fatal error: Class ChildCountrySingleton may not inherit from final class (CountrySingleton) in ・・・

エラー3:インスタンスのクローン

インスタンスのクローンを生成して複数のインスタンスを作成することはできません。__clone() マジックメソッドが private で修飾されているため Fatal error が発生します。

// インスタンスの取得
$country = CountrySingleton::getInstance();

// インスタンスのクローンを作成する
$cln = clone $country; // Fatal error

// Fatal error: Call to private CountrySingleton::__clone() from context ・・・
参考
スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>