25.2. Grundlegende Verwendung

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.

25.2.1. Übungs-Beispiele

Wenn beim Erzeugen der Zend_Session-Instanz kein Namespace angegeben wird, werden alle Daten im 'Default'-Namespace gespeichert. 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 25.1. Seitenaufrufe zählen

<?php
    require_once 'Zend/Session.php';
    $defaultNamespace = new Zend_Session_Namespace('Default');
    $defaultNamespace->numberOfPageRequests++; // wird bei jedem Aufruf erhöht.
    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 25.2. Neuer Weg: Kollisionen durch Namespaces vermeiden

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

    // in einer Web-Services-Komponente
    $webServiceNamespace = new Zend_Session('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 25.3. Alter Weg: PHP-Session-Zugriff

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

25.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 25.4. Session-Iteration

<?php
    // Zend_Session kann in Schritten durchlaufen werden
    require_once 'Zend/Session.php';
    $aNamespace = new Zend_Session('some_namespace_with_data_present');
    foreach ($aNamespace as $index => $value) {
        echo "aNamespace->$index = '$value';\n";
    }
?>

25.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 25.5. Zugriff auf Session-Daten

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