Voici une fonction que j'ai écrit récemment et qui me permet de récupérer rapidement tous mes objets stockés dans ma session.
Au chargement de mon application web, je crée mes objets et les stocke dans ma session.
J'utilise ensuite cette fonction pour récupérer tous mes objets dans toutes mes autres pages ou sections générées par l'Ajax. Je déserialise mes objets et j'utilise eventuellement la méthode __wakeup dans certaines classes pour réactiver par exemple une connexion à une base de données ou réinitialiser certaines variables.
Elle fonctionne bien, et elle est plutôt pratique, mais j'aimerai avoir votre avis et vos commentaires, car récemment je me suis retrouvé dans un cas où j'avais 2 applications web différentes, dans un même navigateur (même fenêtre mais 2 onglets..), et ces 2 applications web utilisant la fameuse fonction, les objets ont été récupérés dans ces 2 applications, d'où des erreurs de classes inexistantes...
J'ai été surpris de constater que les applications se partageait la même session.. Est-ce un comportement normal, et dans ce cas ma fonction apporterai un souci de sécurité.
Merci pour vos commentaires!
Source / Exemple :
<?php
/*
- Démarrage de la session et récupération de tous les objets créés et stockés dans la session
- - Récupère les noms des objets créés
- - Réintègre les fichiers de classes correspondants
- - Désérialise les objets de la session
- /
function getObjects(){
$classes = $objects = array();
$sessionvars = array_keys($_SESSION);
foreach ($sessionvars as $name){
if (substr($_SESSION[$name],0,2)=="O:"){ // Si c'est un objet
$objectname = $name;
for ($i=0;$i<strlen($_SESSION[$name]);$i++){
if (ereg('O:[0-9]+:"[a-zA-Z._-]+"',substr($_SESSION[$name],$i),$temp)){ //recherche dans l'objet serialisé du pattern O:(entier):"nom classe"
$temp = explode(":",$temp[0]); //on transforme la chaîne en tableau
$classname = str_replace(chr(34),"",$temp[2]); //suppression des guillements dans le nom de classe
}
if (!in_array($classname,$classes)) array_push($classes,$classname); //Si le nom de classe n'existe pas déjà on le stocke dans $classes
}
if (!in_array($objectname,$objects)) array_push($objects,$objectname);
}
}
foreach ($classes as $classname) include ("class.$classname.inc.php");
foreach ($objects as $objectname){
global ${$objectname};
${$objectname} = unserialize($_SESSION[$objectname]);
}
}
?>
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.