30.2. 基本的な使用法

Zend_Session_Namespace のインスタンスが、Zend Framework のセッションデータを操作するための基本的な API を提供します。 名前空間を使用するとセッションデータを個別に扱うことができますが、 セッションデータ全体をひとつの名前空間で扱いたい人のためのデフォルト名前空間も用意されています。 Zend_Session_Namespace は、ext/session およびスーパーグローバル変数 $_SESSION を使用して、セッション状態のデータを保存します。 $_SESSION はグローバルにアクセス可能ですが、 開発者はこれに対して直接アクセスするのはやめるべきです。 Zend_Session および Zend_Session_Namespace を用いることで、 セッション関連の機能をより効率的かつ安全に使用できるようになります。

30.2.1. チュートリアル

何も名前空間をしていせずに Zend_Session のインスタンスを作成すると、 すべてのデータは透過的に "Default" という名前の名前空間に保存されます。 Zend_Session は、セッション名前空間コンテナの内容を 直接操作するためのものではあります。そのかわりとして Zend_Session_Namespace を使用します。 以下の例は、このデフォルトの名前空間を使用して ユーザがそのページを何回閲覧したかを数える方法を示すものです。 実際に試してみたい場合は、 以下のコードを ZF の起動ファイル内に記述します

例 30.1. ページビューの数え方

<?php
    require_once 'Zend/Session.php';

    $defaultNamespace = new Zend_Session_Namespace('Default');

    // use the magic method __isset() in Zend_Session_Namespace:
    if (isset($defaultNamespace->numberOfPageRequests)) {
        $defaultNamespace->numberOfPageRequests++; // これが、ページが読み込まれるたびに加算されます
    } else {
        $defaultNamespace->numberOfPageRequests = 1; // 一回目
    }

    echo "このセッションでページがリクエストされた回数: ", $defaultNamespace->numberOfPageRequests;
?>

Zend_Session_Namespace の数多くの利点のうちのひとつに、 複数のモジュールがそれぞれ異なるレベルのカプセル化を行えるという点があります。 Zend_Session_Namespace のコンストラクタには、オプションの引数 $namespace を渡すことができます。これを使用することで、 あるコンポーネントやモジュール、コードのデータが 他のコンポーネントやモジュール、コードから守られるようになります。 名前空間は、セッション状態データが不意に変更されてしまうことを防ぐ 効率的で "安全な" 仕組みを提供します。 名前空間名に使用できるのは、空でない PHP 文字列です。 先頭にアンダースコア ('_') 文字を使用することはできません。 'Zend_' で始まる名前空間を使用できるのは、Zend Framework のコアコンポーネントのみです。

例 30.2. 新しい方法: 名前空間の衝突を避ける

<?php
    // Zend_Auth コンポーネント用
    require_once 'Zend/Session.php';
    $authNamespace = new Zend_Session_Namespace('Zend_Auth');
    $authNamespace->user = "myusername";

    // ウェブサービスコンポーネント用
    $webServiceNamespace = new Zend_Session_Namespace('Some_Web_Service');
    $webServiceNamespace->user = "mywebusername";
?>

上の例は、この下のコードと同じ結果になります。 ただ、上の例ではセッションデータがそれぞれの名前空間でカプセル化されています。

例 30.3. 古い方法: PHP のセッションへのアクセス

<?php
    $_SESSION['Zend_Auth']['user'] = "myusername";
    $_SESSION['Some_Web_Service']['user'] = "mywebusername";
?>

30.2.2. セッション名前空間の順次処理

Zend_Session_NamespaceIteratorAggregate インターフェイス を完全に実装しており、foreach 文をサポートしています。

例 30.4. セッションの順次処理

<?php
    // Zend_Session は順次処理が可能です
    require_once 'Zend/Session.php';
    $aNamespace = new Zend_Session_Namespace('some_namespace_with_data_present');
    foreach ($aNamespace as $index => $value) {
        echo "aNamespace->$index = '$value';\n";
    }
?>

30.2.3. セッション名前空間へのアクセス方法

通常のアクセス用に、マジックメソッド __set()、__unset()、__isset() および __get() をサポートしています。これらのマジックメソッドを、 Zend_Session のサブクラス以外から直接使用してはいけません。その代わりに、 以下のように通常の演算子を使用します。

例 30.5. セッションデータへのアクセス

<?php
            $object->property = $value; echo
            (isset($object->property) ? 'set' : 'unset');
?>