21.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.

21.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 des 'Default'-Namespace und zeigt, wie man die Anzahl der Seitenaufrufe auf einer Website durch einen Nutzer zählen kann. Erweitern Sie Ihren ZF-Bootstrap-Bereich um folgenden Code (mit Ausnahme des echo):

Beispiel 21.1. Seitenaufrufe zählen

<?php
    require_once 'Zend/Session.php';
    $session = new Zend_Session();
    $session->numberOfPageRequests++; // wird bei jedem Aufruf erhöht.
    echo "Seitenaufrufe in dieser Session: ", $session->numberOfPageRequests;
?>

Einer der vielen Vorteile von Zend_Session ist, dass mehrere Module Zend_Session nutzen können und ihre Daten dadurch zu einem gewissen Grad voneinander abgekapselt werden. 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 21.2. Neuer Weg: Kollisionen durch Namespaces vermeiden

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

    // in einer Web-Services-Komponente
    $web_service_session = new Zend_Session('Irgendein_Web_Service');
    $web_service_session->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. Diverse Überprüfungen und die Verwendung eines Singleton-Patterns in Zend_Session_Core sind dafür verantwortlich, dass diese Kapselung erzwungen wird.

Beispiel 21.3. Alter Weg: PHP-Session-Zugriff

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

21.2.2. Schleife über Session-Namespaces

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

Beispiel 21.4. Session-Iteration

<?php
    // Zend_Session kann in Schritten durchlaufen werden
    require_once 'Zend/Session.php';
    $my_session = new Zend_Session();
    foreach ($my_session as $name => $value) {
        ....
    }
?>

21.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 21.5. Zugriff auf Session-Daten

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