TigerZF
🌐Español

65.2. Uso básico

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.

65.2.1. Ejemplos didácticos

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";

65.2.2. Iterar sobre espacios de nombres de sesión

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";
}

65.2.3. Accesores de los espacios de nombres de sesió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);