21.2. Основы использования

Zend_Session использует расширение ext/session и его суперглобальный массив $_SESSION в качестве механизма хранения данных сессий. Несмотря на то, что $_SESSION остается доступным в глобальном пространстве имен, разработчики должны избегать прямого обращения к нему с тем, чтобы Zend_Session мог наиболее безопасно и эффективно предоставлять свой набор функциональных возможностей для работы с сессиями.

21.2.1. Примеры

Если при инстанцировании Zend_Session не было указано пространство имен, то все данные будут неявным образом сохранены в пространстве имен 'Default'. Пример ниже демонстрирует использование пространства имен 'Default' и показывает, как подчитывать количество просмотров страниц на вашем веб-сайте. Добавьте следующий код в файл загрузки:

Пример 21.1. Подсчет количества просмотров страниц

<?php
    require_once 'Zend/Session.php';
    $session = new Zend_Session();
    // увеличение на единицу при каждой загрузке страницы 
    $session->numberOfPageRequests++;
    echo "Запросов к страницам в течение данной сессии: ", $session->numberOfPageRequests;
?>

Одним из многих преимуществ Zend_Session является то, что многие модули приложения могут использовать Zend_Session, и он предоставляет им некоторый уровень инкапсуляции данных. Экземпляру Zend_Session можно передавать необязательный аргумент $namespace в конструкторе, который позволяет другим компонентам, модулям и разрабочикам определенного кода быть уверенным в том, что их данные защищены отделением от других областей данных, используемых другими компонентами, модулями и кодами разработчиков. Пространства имен предоставляют эффективный и общедоступный способ защиты данных сессий от случайных изменений. Имена пространств имен должны быть непустыми строками, не начинающимися со знака подчеркивания. Только основные компоненты, включенные в Zend Framework, должны использовать имена пространств имен, начинающиеся с 'Zend_'.

Пример 21.2. Новый подход: избежание конфликтов с помощью пространств имен

<?php
    // в компоненте Zend-Auth
    require_once 'Zend/Session.php';
    $auth_session = new Zend_Session('Zend_Auth');
    $auth_session->user = "myusername";

    // в компоненте веб-сервисов
    $web_service_session = new Zend_Session('Some_Web_Service');
    $web_service_session->user = "mywebusername";
?>

Пример выше приводит к тому же результату, что и код ниже за тем исключением, что объекты сессий сохраняют инкапсуляцию сессионных данных внутри их пространств имен. Различные проверки, объединенные с паттерном синглетон (singleton) в Zend_Session_Core усиливают инкапсуляцию.

Пример 21.3. Старый подход: обращение к сессиям PHP

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

21.2.2. Итерация по пространствам имен

Zend_Session предоставляет полный интерфейс IteratorAggregate, включая поддержку выражения foreach:

Пример 21.4. Итерация по сессии

<?php
    // Zend_Session поддерживает итерацию
    require_once 'Zend/Session.php';
    $my_session = new Zend_Session();
    foreach ($my_session as $name => $value) {
        ....
    }
?>

21.2.3. Методы доступа для пространств имен

Обычные методы доступа доступны через "магические" методы (magic methods) __set(), __unset(), __isset() и __get(). "Магические" методы не должны импользоваться напрямую, кроме как внутри подклассов Zend_Session. Вместо этого используйте обычные операторы для вызова этих "магических" методов, например:

Пример 21.5. Доступ к сессионным данным

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