前日の続き。 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 } } }