25.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ą.

25.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". Poniższy przykład demonstruje użycie tej 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 25.1. Zliczanie odsłon stron

<?php
    require_once 'Zend/Session.php';
    $defaultNamespace = new Zend_Session_Namespace('Default');
    $defaultNamespace->numberOfPageRequests++; // to będzie inkrementowane po każdym przeładowaniu strony
    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 25.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 25.3. Stary sposób: Dostęp do sesji PHP

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

25.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 25.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";
    }
?>

25.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 25.5. Uzyskiwanie dostępu do danych sesji

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