29.2. Grundlegende Verwendung

Zend_Session_Namespace Instanzen stellen die primäre API für das Ändern von Session Daten im Zend Framework bereit. Namensräume werden verwendet, um Session Daten zu kapseln, auch wenn ein Standard Namensraum für diejenigen existiert, die nur einen Namensraum für ihre Session Daten verwenden möchten. Zend_Session verwendet ext/session und seine besondere superglobale Variable $_SESSION als Speicher-Mechanismus für Session-Zustands-Daten. Auch wenn die Variable $_SESSION immernoch global zugänglich ist, sollten Entwickler davon absehen direkt auf sie zuzugreifen, damit Zend_Session effektiv und sicher seine Sammlung session-spezifischer Funktionalität zur Verfügung stellen kann.

29.2.1. Übungs-Beispiele

Wenn beim Erzeugen der Zend_Session-Instanz kein Namensraum angegeben wird, werden alle Daten im 'Default'-Namespace gespeichert. Zend_Session hat nicht die Aufgabe, direkt auf die Inhalte der Container für die Session Namensräume zuzugreifen. Stattdessen verwenden wir Zend_Session_Namespace. Das Beispiel unten demonstriert die Nutzung dieses Standard-Namespace und zeigt, wie man die Anzahl der Seitenaufrufe auf einer Website durch einen Nutzer zählen kann. Um dies zu testen, erweitern Sie Ihren ZF-Bootstrap-Bereich um folgenden Code:

Beispiel 29.1. Seitenaufrufe zählen

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

    $defaultNamespace = new Zend_Session_Namespace('Default');

    // verwende die magische Methode __isset() in Zend_Session_Namespace:
    if (isset($defaultNamespace->numberOfPageRequests)) {
        $defaultNamespace->numberOfPageRequests++; // wird bei jedem Aufruf erhöht.
    } else {
        $defaultNamespace->numberOfPageRequests = 1; // erstes Mal
    }

    echo "Seitenaufrufe in dieser Session: ", $defaultNamespace->numberOfPageRequests;
?>

Einer der vielen Vorteile von Zend_Session_Namespace ergibt sich, wenn mehrere Module Zend_Session_Namespace nutzen und ihre Session Daten kapseln. Zend_Session kann über den Konstruktor ein optionales $namespace-Argument übergeben werden, welches dazu führt, dass die Daten anderer Komponenten, Module oder entwicklerspezifischer Code-Teile durch eine Trennung zwischen den Daten-Bereichen vor versehentlichem Überschreiben geschützt sind. Die Verwendung von Namespaces ist ein populäres Mittel, um eine Teilmenge der Session-Zustands-Daten vor unbeabsichtigtem Überschreiben zu "schützen". Als Namen für Namespaces sind nur nicht-lehre PHP-Strings erlaubt, die nicht mit einem Unterstrich ('_') beginnen. Nur mitgelieferte Kern-Komponenten des Zend-Frameworks sollten Namespaces benutzen, die mit 'Zend_' beginnen.

Beispiel 29.2. Neuer Weg: Kollisionen durch Namespaces vermeiden

<?php
    // in der Zend_Auth Komponente
    require_once 'Zend/Session.php';
    $authNamespace = new Zend_Session_Namespace('Zend_Auth');
    $authNamespace->user = "myusername";

    // in einer Web-Services-Komponente
    $webServiceNamespace = new Zend_Session_Namespace('Some_Web_Service');
    $webServiceNamespace->user = "mywebusername";
?>

Das obige Beispiel erzielt den selbst Effekt wie der Code unten, mit dem Unterschied, dass das Session-Objekt oben die Kapselung der Session-Daten in ihrem jeweiligen Namensbereich aufrecht erhält.

Beispiel 29.3. Alter Weg: PHP-Session-Zugriff

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

29.2.2. Schleife über Session-Namespaces

Zend_Session_Namespace stellt das volle IteratorAggregate-Interface zur Verfügung, einschließlich der Unterstützung des foreach Statements:

Beispiel 29.4. Session-Iteration

<?php
    // Zend_Session kann in Schritten durchlaufen werden
    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";
    }
?>

29.2.3. Zurgriffsfunktionen für Session-Namespaces

Die üblichen Zugriffsmethoden sind verfügbar, zur Verfügung gestellt durch die magischen Methoden __set(), __unset(), __isset() und __get(). Diese Methoden sollten nicht direkt benutzt werden, außer aus Unterklassen von Zend_Session. Statt dessen verwendet man normale Operatoren, um diese magischen Methoden aufzurufen, zum Beispiel:

Beispiel 29.5. Zugriff auf Session-Daten

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