ここでは、オブジェクト指向のデザインパターンの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 ・・・