CakePHPのソースで一つ勉強になったのでメモ(ひょっとしたら古くからの定石かも知れませんが・・・)

クラスのメンバー変数を初期値に戻すためのリセットメソッドを用意することってあると思います。このときメソッドの中に初期値をコピーして貼り付けても良いんですが、いちいち同じ値に更新するのも面倒くさい。特に開発中には何かと変更がつきものなのでどうにもスマートじゃない。

そんなときCakePHPで見つけたこのパターンを使うととても良さそう。初期値をセットするコンテナを用意して、クラスを呼び出したタイミングでまずそこに初期値をコピー。次にリセットしたい場合はその初期値でプロパティを上書きしてもとに戻すという仕組み。これならプロパティを変更してもいちいちリセットメソッドに変更を加える必要ありませんね。

以下のソースコードでそれを確認できます。

参考ソース

Inflector::reset()

class Inflector {
    protected $_initialState = array();
    public static function reset() {
        if (empty(self::$_initialState)) {
            self::$_initialState = get_class_vars('Inflector');
            return;
        }
        foreach (self::$_initialState as $key => $val) {
            if ($key != '_initialState') {
                self::${$key} = $val;
            }
        }
    }
}

// Store the initial state
Inflector::reset();

Router::reload()

class Router {
    protected $_initialState = array();
    public static function reload() {
        if (empty(self::$_initialState)) {
            self::$_initialState = get_class_vars('Router');
            self::_setPrefixes();
            return;
        }
        foreach (self::$_initialState as $key => $val) {
            if ($key != '_initialState') {
                self::${$key} = $val;
            }
        }
        self::_setPrefixes();
    }
}

// Save the initial state
Router::reload();

そのほか

HttpSocket::reset() や、その継承元メソッド CakeSocket::reset() でも static ではない場合の例を見ることができます。

CakePHP ver. 2.3.0