RegistryパターンをPHP5で作成

Registryパターン

MVCパターンのフレームワーク、CakePHPでは、FormHelperというViewにて呼び出されるヘルパクラスがありますが、 これはModelのデータを参照し、Formの形成を半自動的に行うものでした。
ModelをViewで呼ぶ方法はどのようにしているか、ソースを覗いて見た所、ClassRegistryというものを利用していました。
これは、Singletonパターンで呼び出し、modelなどクラスオブジェクトを格納し、任意の場所で取得することができるものです。
これをPHP5で記述してみました。(かなりザックリですが)

<?php

class MyRegistry{
	
	private static $instance;
	
	public $objects = array();
	
	/*==================================
		外からnewでインスタンスを作成できないようにprivateにする
	==================================*/
	private function __construct(){
		
	}
	
	/*==================================
		通常はコレをpublicにして単一のインスタンスを呼ぶようにするわけですが
		これもaddObject/getObject以外から呼べないようにする。
	===================================*/
	private static function getInstance(){
		if(self::$instance === null){ //staticなメンバ変数が空だったら
			self::$instance = new MyRegistry(); //クラス内部から自分自身をnewしてやる
		}
		return self::$instance; //で、それを返す。
	}
	
	public static function addObject($key, $object){
		$self = self::getInstance(); //自分自身のインスタンスを読んできてやり
		$self->objects[$key] = $object; //メンバ変数に名前とオブジェクトを格納
	}
	
	public static function getObject($key){
		$self = self::getInstance(); //自分自身のインスタンスを読んできてやり
		return $self->objects[$key]; //登録されている$keyのオブジェクトを呼ぶ
	}
	
	public static function keyExists($key){
		$self = self::getInstance();
		if(array_key_exists($key, $self->objects[$key])) return true;
		return false;
	}
}

?>

ここまで記述して考え直してみましたが、わざわざSingletonを引かなくても、PHP5にはstaticなメンバ変数が引けるので、 もっと簡単にできますね。

<?php

class MyRegistry{
	
	private static $objects = array();
	
	/*==================================
		外からnewでインスタンスを作成できないようにprivateにする
	==================================*/
	private function __construct(){
		
	}
	
	public static function addObject($key, $object){
		self::$objects[$key] = $object;
	}
	
	public static function getObject($key){
		return self::$objects[$key];
	}
	
	public static function keyExists($key){
		if(array_key_exists($key, self::$objects[$key])) return true;
		return false;
	}
}

?>

最初の記述のものはRegistryクラスで何らかの演算処理を行う場合に有効なのかもしれません(こじつけですが)。

参考:CakePHPのClassRegistryクラスと、某所に自分で記述した質問の回答より