<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 17175 -->
<!-- Reviewed: no -->
<sect1 id="zend.session.basic_usage">

    <title>Grundsätzliche Verwendung</title>

    <para>
        <classname>Zend_Session_Namespace</classname> Instanzen stellen die primäre
        <acronym>API</acronym> für das Manipulieren von Session Daten im Zend Framework bereit.
        Namensräume werden verwendet um alle Session Daten zu kapseln, aber es existiert auch ein
        Standard Namensraum für jene die nur einen Namensraum für alle Session Daten benötigen.
        <classname>Zend_Session</classname> verwendet die Erweiterung ext/session und dessen
        spezielle superglobale Variable <varname>$_SESSION</varname> als Speichermechanismus für
        Session Daten. Wärend <varname>$_SESSION</varname> im globalen Namensraum von
        <acronym>PHP</acronym> noch immer vorhanden ist, sollten Entwickler davon absehen diese
        direkt zu verwenden, damit <classname>Zend_Session</classname> und
        <classname>Zend_Session_Namespace</classname> am effizientesten und sichersten Ihre Sammlung
        von Session relevanten Funktionen bereitstellen können.
    </para>

    <para>
        Jede Instanz von <classname>Zend_Session_Namespace</classname> korrespondiert mit einem
        Eintrag des Superglobalen Arrays <varname>$_SESSION</varname>, wobei die Namensräume als
        Schlüssel verwendet werden.

        <programlisting language="php"><![CDATA[
$myNamespace = new Zend_Session_Namespace('myNamespace');

// $myNamespace corresponds to $_SESSION['myNamespace']
]]></programlisting>

        Es ist möglich Zend_Session in Verbindung mit anderem Code zu verwenden welche
        <varname>$_SESSION</varname> direkt verwendet. Um Probleme zu vermeiden wird trotzdem
        stärkstens empfohlen das solcher Code nur Teile von <varname>$_SESSION</varname> verwendet
        die nicht mit Instanzen von <classname>Zend_Session_Namespace</classname> korrespondieren.
    </para>

    <sect2 id="zend.session.basic_usage.basic_examples">

        <title>Übungs Beispiele</title>

        <para>
            Wenn kein Namensraum bei der Instanziierung von
            <classname>Zend_Session_Namespace</classname> definiert wurde, werden alle Daten
            transparent in einem Namensraum gespeichert der "<code>Default</code>" heißt.
            <classname>Zend_Session</classname> ist nicht dazu gedacht um direkt mit den Inhalten
            von Containern der Session Namensräume zu arbeiten. Stattdessen wird
            <classname>Zend_Session_Namespace</classname> verwendet. Das folgende Beispiel
            demonstriert die Verwendung dieses Standard Namensraums und zeigt wie die Anzahl der
            Zugriffe eines Benutzers gezählt werden kann.
        </para>

        <example id="zend.session.basic_usage.basic_examples.example.counting_page_views">

            <title>Seitenzugriffe zählen</title>

            <programlisting language="php"><![CDATA[
$defaultNamespace = new Zend_Session_Namespace('Default');

if (isset($defaultNamespace->numberOfPageRequests)) {
 // Das erhöht den Zählen für jeden Seitenaufruf
    $defaultNamespace->numberOfPageRequests++;
} else {
    $defaultNamespace->numberOfPageRequests = 1; // Erster Zugriff
}

echo "Seitenzugriffe in dieser Session: ",
    $defaultNamespace->numberOfPageRequests;
]]></programlisting>

        </example>

        <para>
            Wenn mehrere Module Instanzen von <classname>Zend_Session_Namespace</classname>
            verwenden die verschiedene Namensräume haben, erhält jedes Modul Datenkapselung für die
            eigenen Daten der Session. Dem <classname>Zend_Session_Namespace</classname> Konstruktor
            kann ein optionales <varname>$namespace</varname> Argument übergeben werden, welches
            Entwicklern erlaubt Session Daten in eigene Namensräume zu partitionieren. Die
            Verwendung von Namensräumen ist ein effektiver und populärer Weg um Session Daten
            gegenüber Änderungen durch ungewollte Namenskollisionen sicher zu machen.
        </para>

        <para>
            Namen für Namensräume sind limitiert auf Sequenzen von Zeichen die als nicht leere
            <acronym>PHP</acronym> Strings dargestellt werden und nicht mit einem Unterstrich
            ("<code>_</code>") Zeichen beginnen. Nur Kern Komponenten die im Zend Framework
            inkludiert sind sollten Namen für Namensräume der wenden die mit "<code>Zend</code>"
            beginnen.
        </para>

        <example id="zend.session.basic_usage.basic_examples.example.namespaces.new">

            <title>Neuer Weg: Namensräume verhindern Kollisionen</title>
            <programlisting language="php"><![CDATA[
// In der Zend_Auth Komponente
require_once 'Zend/Session.php';
$authNamespace = new Zend_Session_Namespace('Zend_Auth');
$authNamespace->user = "meinbenutzername";

// In einer Web Service Komponente
$webServiceNamespace = new Zend_Session_Namespace('Mein_Web_Service');
$webServiceNamespace->user = "meinwebbenutzername";
]]></programlisting>
        </example>

        <para>
            Das obige Beispiel erzielt den gleichen Effekt wie der folgende Code, ausser das die
            obigen Session Objekte die Kapselung der Session Daten innerhalb des jeweiligen
            Namensraumes aufrecht erhält.
        </para>

        <example id="zend.session.basic_usage.basic_examples.example.namespaces.old">

            <title>Alter Weg: PHP Session Zugriff</title>

            <programlisting language="php"><![CDATA[
$_SESSION['Zend_Auth']['user'] = "meinbenutzername";
$_SESSION['Some_Web_Service']['user'] = "meinwebbenutzername";
]]></programlisting>

        </example>

    </sect2>

    <sect2 id="zend.session.basic_usage.iteration">

        <title>Session Namensräume wiederholen</title>

        <para>
            <classname>Zend_Session_Namespace</classname> stellt das komplette <ulink
                url="http://www.php.net/~helly/php/ext/spl/interfaceIteratorAggregate.html">IteratorAggregate
                Interface</ulink> zur Verfügung, was die Unterstützung der <code>foreach</code>
            Anweisung beinhält:
        </para>

        <example id="zend.session.basic_usage.iteration.example">

            <title>Session wiederholen</title>

            <programlisting language="php"><![CDATA[
$aNamespace =
    new Zend_Session_Namespace('Einige_Namensräume_Mit_aktuellen_Daten');

foreach ($aNamespace as $index => $value) {
    echo "aNamespace->$index = '$value';\n";
}
]]></programlisting>
        </example>

    </sect2>

    <sect2 id="zend.session.basic_usage.accessors">

        <title>Zugriffsfunktionen für Session Namensräume</title>

        <para>
            <classname>Zend_Session_Namespace</classname> implementiert die <ulink
                url="http://www.php.net/manual/de/language.oop5.overloading.php">magischen
                Methoden</ulink> <methodname>__get()</methodname>, <methodname>__set()</methodname>,
            <methodname>__isset()</methodname>, und <methodname>__unset()</methodname> welche nicht
            direkt angesprochen werden sollte, ausser von innerhalb einer Subklasse. Stattdessen
            verwenden die normalen Opteratoren automatisch diese Methoden, wie im folgenden
            Beispiel:
        </para>

        <example id="zend.session.basic_usage.accessors.example">

            <title>Zugriff auf Session Daten</title>

            <programlisting language="php"><![CDATA[
$namespace = new Zend_Session_Namespace(); // Standard Namensraum

$namespace->foo = 100;

echo "\$namespace->foo = $namespace->foo\n";

if (!isset($namespace->bar)) {
    echo "\$namespace->bar nicht gesetzt\n";
}

unset($namespace->foo);
]]></programlisting>
        </example>

    </sect2>

</sect1>
