Page 1 sur 1

objet en session

Posté : 17 août 2009, 17:06
par narcisse
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.

Re: objet en session

Posté : 17 août 2009, 17:51
par FuZZyLine
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
//
@+ ;)

Re: objet en session

Posté : 17 août 2009, 18:13
par zeus
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.

Re: objet en session

Posté : 17 août 2009, 18:23
par FuZZyLine
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... ;)

Re: objet en session

Posté : 17 août 2009, 19:09
par AB
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'];

                       //...
                 }

                      //...	

}

Re: objet en session

Posté : 24 août 2009, 13:00
par Hywan
Hey :-),

Zeus +1, c'est la bonne solution.