objet en session

Eléphant du PHP | 111 Messages

17 août 2009, 17:06

Bonjour,

comment fait-on pour passer un objet dans une variable de session ?

J'ai bien inclus mes classes avant le session_start.

Faut il utiliser la serialisation ?

Cas d'un panier, qui contient des articles, est-il possible de faire :
$_SESSION['panier'] = new panier();
$_SESSION['panier']->ajouterArticle($article);
Merci de votre aide.

Eléphant du PHP | 369 Messages

17 août 2009, 17:51

Salut,
Bonjour,
comment fait-on pour passer un objet dans une variable de session ?
J'ai bien inclus mes classes avant le session_start.
Faut il utiliser la serialisation ?
Cas d'un panier, qui contient des articles, est-il possible de faire :
$_SESSION['panier'] = new panier();
$_SESSION['panier']->ajouterArticle($article);
Merci de votre aide.
Toujours plusisur possibilités... mais je pense que sérialiser semble une bonne chose.

Sinon tu as la façon un peu plus lente mais pas sans intérêt. Le copier clef/item
par listage...

1)
// IN
//
if ($objet_ton_panier instanceof TA_CLASS_PNNIER)
{
   $str = serialize($objet_ton_panier);
   $_SESSION[panier] = $str;
}

// OUT, L'inverse étant
//
if (isset($_SESSION[panier])) $objet_ton_panier = unserialize($_SESSION[panier]);
else $objet_ton_panier = new TA_CLASS_PANIER();
2)
// IN
//
if ($objet_ton_panier instanceof TA_CLASS_PANIER)
{
   foreach($array AS $key => $value)
   {
      $_SESSION[panier][$key] = $value;
   }
}
// OUT, Tu connais la suite
//
@+ ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 août 2009, 18:13

Il existe 2 méthodes magiques qui pourraient bien convenir à ton problème :
__wakeup() et __sleep()

Si je ne m'abuse, elles sont appellées automatiquement sur les classes se trouvant en session lorsqu'un script se termine et lorsque la session est rechargée.
Cela te permettrait donc d'utiliser ton instance dans la session, sans te soucier de la sérialiser, et de coder proprement la séralisation et la désérialisation directement dans le corps de ta classe.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 369 Messages

17 août 2009, 18:23

Salut,
Il existe 2 méthodes magiques qui pourraient bien convenir à ton problème :
__wakeup() et __sleep()

Si je ne m'abuse, elles sont appellées automatiquement sur les classes se trouvant en session lorsqu'un script se termine et lorsque la session est rechargée.
Cela te permettrait donc d'utiliser ton instance dans la session, sans te soucier de la sérialiser, et de coder proprement la séralisation et la désérialisation directement dans le corps de ta classe.
+1, je pense jamais à ces fonctions moi... ;)

ViPHP
AB
ViPHP | 5818 Messages

17 août 2009, 19:09

Eventuellement, tu peux ne sauvegarder que le tableau utile en l'assignant par référence à une variable de session :
class Panier {
	
	//...

    private $panier = array();

       //...
			
		public function __construct() {
			
                        if (!session_id()) session_start();	

			if (!isset($_SESSION['panier'])) $_SESSION['panier'] = array();

			$this->panier =& $_SESSION['panier'];

                       //...
                 }

                      //...	

}

ViPHP
ViPHP | 4674 Messages

24 août 2009, 13:00

Hey :-),

Zeus +1, c'est la bonne solution.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).