30.2. Podstawowe użycie

Instancje Zend_Session_Namespace zapewniają główne API do manipulowania danymi sesji w Zend Framework. Przestrzenie nazw są używane do segregowania wszystkich danych sesji, chociaż dla tych, którzy potrzebują tylko jednej przestrzeni nazw dla wszystkich danych sesji, istnieje domyślna przestrzeń nazw. Zend_Session używa rozszerzenia session i jego specjalnej superglobalnej tablicy $_SESSION jako mechanizmu składowania danych stanu sesji. Dopóki tablica $_SESSION jest wciąż dostępna w globalnej przestrzeni nazw PHP, programiści powinni wystrzegać się uzyskiwania bezpośredniego dostępu do niej, więc dlatego Zend_Session oraz Zend_Session_Namespace mogą najbardziej efektywnie i bezpiecznie zapewniać zbiór funkcjonalności związanych z sesją.

30.2.1. Przykłady

Jeśli przestrzeń nazw nie zostanie określona przy tworzeniu instancji Zend_Session, wszystkie dane będą przechowywane w przestrzeni nazw "Default". Klasa Zend_Session nie jest przeznaczona do bezpośredniej pracy z zawartością przestrzeni nazw sesji. Zamiast niej używamy klasy Zend_Session_Namespace. Poniższy przykład demonstruje użycie domyślnej przestrzeni nazw, pokazując jak obliczyć ile razy użytkownik oglądał strony w twoim serwisie. Aby przetestować ten przykład, dodaj poniższy kod do twojego pliku ładującego ZF:

Przykład 30.1. Zliczanie odsłon stron

<?php
    require_once 'Zend/Session.php';
    $defaultNamespace = new Zend_Session_Namespace('Default');

    // używamy magicznej metody __isset() w Zend_Session_Namespace:
    if (isset($defaultNamespace->numberOfPageRequests)) {
        $defaultNamespace->numberOfPageRequests++; // to będzie inkrementowane po każdym przeładowaniu strony
    } else {
        $defaultNamespace->numberOfPageRequests = 1; // pierwsze przeładowanie
    }

    echo "Page requests this session: ", $defaultNamespace->numberOfPageRequests;
?>

Jedną z wielu zalet klasy Zend_Session_Namespace widać wtedy, gdy wiele modułów używa Zend_Session_Namespace i uzyskuje dostęp do hermetyzacji danych sesji. Do konstruktora Zend_Session można przekazać opcjonalny argument $namespace, który pozwala innym komponentom, modułom oraz specyficznemu kodowi programisty na uzyskanie gwarancji tego, że ich dane będą zabezpieczone przegrodą od obszarów danych używanych przez inne komponenty, moduły oraz inny kod programisty. Przestrzenie nazw zapewniają efektywny i popularny sposób do zabezpieczenia podzbiorów danych stanu sesji przed przypadkowymi zmianami. Nazwy przestrzeni nazw mogą składać się tylko z niepustych łańcuchów znaków PHP, ktęre nie zaczynają się od znaku podkreślnika ('_'). Jedynie rdzenne komponenty zawarte w Zend Framework powinny używać przestrzeni nazw o nazwach zaczynających się od 'Zend_'.

Przykład 30.2. Nowy sposób: Przestrzenie nazw zapobiegają kolizjom

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

    // w komponencie serwisów web
    $webServiceNamespace = new Zend_Session_Namespace('Some_Web_Service');
    $webServiceNamespace->user = "mywebusername";
?>

Powyższy przykład daje ten sam efekt jak kod poniżej, z wyjątkiem tego, że obiekt sesji utrzymuje hermetyzację danych sesji wewnątrz odpowiadającej mu przestrzeni nazw.

Przykład 30.3. Stary sposób: Dostęp do sesji PHP

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

30.2.2. Iteracja poprzez przestrzenie nazw sesji

Zend_Session_Namespace zapewnia pełny interfejs IteratorAggregate , właczając w to obsługę wyrażenia foreach:

Przykład 30.4. Iteracja sesji

<?php
    // Zend_Session możemy iterować
    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. Metody dostępowe do przestrzeni nazw sesji

Standardowe metody dostępowe są dostępne za pomocą magicznych metod __set(), __unset(), __isset(), oraz __get(). Magiczne metody nie powinny być używane bezpośrednio, z wyjątkiem wnętrza klasy rozszerzającej Zend_Session. Zamiast tego, używaj normalnych operatorów aby wywoływać te magiczne metody, na przykład:

Przykład 30.5. Uzyskiwanie dostępu do danych sesji

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