前日の続き。 Zend_Session_Namespaceでは__get()、__set()、__isset()、 __unset()をオーバーロードして``` $myNamespace = new Zend_Session_Namespace(‘foo’);
// $_SESSION[‘foo’][‘bar’] = $valueと同等 $myNamespace->bar = $vaule;
// $bar = $_SESSION[‘foo’][‘bar’]と同等
$bar = $myNamespace->bar;
のような記述が可能になっています。 \_\_set()では、内部でこのネームスペースにロックがかかっていないか(Zend\_Session\_Namespaceのlock()で設定)、セッション自体が書き込み可能になっているか(Zend\_Sessionで設定可能) をチェックした上で、$\_SESSIONに値を代入しています。 \_\_get()、\_\_isset()、\_\_unset() 3つについては、内部でそれぞれZend\_Session\_Abstractの\_namespaceGet()、\_namespaceIsset()、\_namespaceUnset()を呼び出しています。ちなみに、Zend\_Session\_NamespaceはZend\_Session\_Abstractを継承しています。 上記3関数ともに、セッション自体が読み込み可能になっているかを(現在のところ読み込み不可にする方法はないです)確認したあと、それぞれ該当のセッションの値を返したり、isset()で調べたり、unset()したりしているのですが、$\_SESSIONだけではなくself::$\_expiringDataという配列も処理の対象になっています。 例えば、\_\_get()から呼び出される\_namespaceGet()の場合、該当のセッションデータがない場合には、$\_expiringDataを返しています。
protected static function & _namespaceGet($namespace, $name = null)
{
// (省略)
if ($name === null) {
if (isset($_SESSION[$namespace])) { // check session first for data requested
return $_SESSION[$namespace];
} elseif (isset(self::$_expiringData[$namespace])) { // check expiring data for data reqeusted
return self::$_expiringData[$namespace];
} else {
return $_SESSION[$namespace]; // satisfy return by reference
}
} else {
if (isset($_SESSION[$namespace][$name])) { // check session first
return $_SESSION[$namespace][$name];
} elseif (isset(self::$_expiringData[$namespace][$name])) { // check expiring data
return self::$_expiringData[$namespace][$name];
} else {
return $_SESSION[$namespace][$name]; // satisfy return by reference
}
}
}