Las instancias de Zend_Session_Namespace proporcionan la
API principal para manipular datos de sesión en Zend Framework. Los espacios de nombres se
usan para segregar todos los datos de sesión, aunque existe un espacio de nombres predeterminado para quienes solo
quieran un espacio de nombres para todos sus datos de sesión. Zend_Session utiliza
ext/session y su superglobal especial $_SESSION como mecanismo de almacenamiento
para los datos de estado de sesión. Aunque $_SESSION sigue estando disponible en
el espacio de nombres global de PHP, los desarrolladores deben abstenerse de acceder directamente a
él, para que Zend_Session y
Zend_Session_Namespace puedan proporcionar de la forma más eficaz y segura su
conjunto de funcionalidades relacionadas con la sesión.
Cada instancia de Zend_Session_Namespace corresponde a una entrada de
la matriz superglobal $_SESSION, donde el espacio de nombres se usa como clave.
$myNamespace = new Zend_Session_Namespace('myNamespace');
// $myNamespace corresponds to $_SESSION['myNamespace']
Es posible usar Zend_Session junto con otro código
que use $_SESSION directamente. Sin embargo, para evitar problemas, se
recomienda encarecidamente que dicho código use solo las partes de $_SESSION que no
correspondan a instancias de Zend_Session_Namespace.
Si no se especifica ningún espacio de nombres al crear una instancia de
Zend_Session_Namespace, todos los datos se almacenarán de forma transparente en
un espacio de nombres llamado "Default". Zend_Session no está
pensado para trabajar directamente sobre el contenido de los contenedores de espacios de nombres de sesión. En su lugar,
se usa Zend_Session_Namespace. El siguiente ejemplo demuestra el uso de
este espacio de nombres predeterminado, mostrando cómo contar el número de solicitudes de cliente durante una
sesión:
Ejemplo 65.1. Contando visualizaciones de página
$defaultNamespace = new Zend_Session_Namespace('Default');
if (isset($defaultNamespace->numberOfPageRequests)) {
// this will increment for each page load.
$defaultNamespace->numberOfPageRequests++;
} else {
$defaultNamespace->numberOfPageRequests = 1; // first time
}
echo "Page requests this session: ",
$defaultNamespace->numberOfPageRequests;
Cuando varios módulos usan instancias de Zend_Session_Namespace
con distintos espacios de nombres, cada módulo obtiene encapsulación de datos para sus datos
de sesión. Al constructor de Zend_Session_Namespace se le puede pasar un
argumento opcional $namespace, que permite a los desarrolladores dividir
los datos de sesión en espacios de nombres separados. El uso de espacios de nombres proporciona una forma eficaz y popular
de proteger los datos de estado de sesión frente a cambios debidos a colisiones accidentales de nombres.
Los nombres de los espacios de nombres se restringen a secuencias de caracteres representadas como cadenas de
PHP no vacías que no empiecen con un carácter de subrayado ("_").
Solo los componentes principales incluidos en Zend Framework deben usar nombres de espacios de nombres
que empiecen con "Zend".
Ejemplo 65.2. Forma nueva: los espacios de nombres evitan colisiones
// in the Zend_Auth component
$authNamespace = new Zend_Session_Namespace('Zend_Auth');
$authNamespace->user = "myusername";
// in a web services component
$webServiceNamespace = new Zend_Session_Namespace('Some_Web_Service');
$webServiceNamespace->user = "mywebusername";
El ejemplo anterior logra el mismo efecto que el código de abajo, salvo que los objetos de sesión de arriba preservan la encapsulación de los datos de sesión dentro de sus respectivos espacios de nombres.
Ejemplo 65.3. Forma antigua: acceso a la sesión de PHP
$_SESSION['Zend_Auth']['user'] = "myusername"; $_SESSION['Some_Web_Service']['user'] = "mywebusername";
Zend_Session_Namespace proporciona la interfaz completa IteratorAggregate,
incluyendo soporte para la sentencia foreach:
Ejemplo 65.4. Iteración de sesión
$aNamespace =
new Zend_Session_Namespace('some_namespace_with_data_present');
foreach ($aNamespace as $index => $value) {
echo "aNamespace->$index = '$value';\n";
}
Zend_Session_Namespace implementa los métodos
mágicos __get(), __set(),
__isset(), y __unset(), que no deberían invocarse directamente, salvo desde dentro de una
subclase. En su lugar, los operadores normales invocan automáticamente estos métodos, como en
el siguiente ejemplo:
Ejemplo 65.5. Acceso a datos de sesión
$namespace = new Zend_Session_Namespace(); // default namespace
$namespace->foo = 100;
echo "\$namespace->foo = $namespace->foo\n";
if (!isset($namespace->bar)) {
echo "\$namespace->bar not set\n";
}
unset($namespace->foo);