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