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クラスで何らかの演算処理を行う場合に有効なのかもしれません(こじつけですが)。