[Sessions/objets] Sauvegarde d'objets: devient StdClass apres delinearisation
EDIT: Solution aux posts #4 (et #5)
Bonjour a tous.
J'ai un objet "$user->panier", que je serialize pour rentrer dans une variable de session. Probleme, lorsque je "unserialize" l'object, il devient un object de la StdClass et ne me sert donc plus a rien.
Pourtant, la définition de la classe PANIER (celle de l'objet) est faite AVANT le session_start(), etc..
Le petit soupson que j'ai: l'objet $user->panier est créé, comme vous pouvez le voir, DANS le constructeur de la classe USER. c'est dans cette même classe USER qu'elle est sérializée et unsérializée. Ca pourai venir de la ?
Bon, bref, voici le code.
La fameuse classe qui renit son objet (la méchante!):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
<?php
class PANIER
{
public $articles = array();
public $date_dodo = 0;
public function __get ($name) {
$value = null;
if ($name == "nombre_d_articles") {
$value = $this->nombre_d_articles();
} elseif ($name == "total") {
$value = $this->get_total();
} elseif ($name == "articles") {
$value = $this->articles;
} else {
if (!isset($this->articles[$name])) $value = 0;
else $value = $this->articles[$name];
}
return $value;
}
public function __set ($name,$value) {
$this->articles[$name] = $value;
return true;
}
public function remove ($name) {
unset($this->aricles[$name]);
return true;
}
public function nombre_d_articles () {
return array_sum($this->articles);
}
// retourne le prix total
public function get_total () {
$db = DB::getMe();
$total = 0;
foreach ($this->articles as $k => $v)
$total += PRODUIT::prix($k) * $v;
return $total;
}
public function __sleep () {
foreach ($this->articles as $k => $v)
if ($v <= 0) unset($this->articles[$k]);
$this->date_dodo = time();
}
}
?> |
la classe USER au travers de laquelle la classe PANIER est manipulé:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
class USER
{
private static $instance;
private function __construct ($login) {
$db = DB::getMe();
// a proteger !! //
$q = "SELECT * FROM `client` WHERE `login` = '$login'";
$r = $db->queryfetchobject($q);
$this->nom = $r->nom;
$this->prenom = $r->prenom;
$this->login = $r->login;
$this->password = $r->password;
$this->mail = $r->mail;
/* etc.. */
// restore le panier
$this->panier = new PANIER ();
if (!empty($_SESSION['cart']))
$this->panier = unserialize($_SESSION['cart']);
}
public static function getMe ($login=null) {
if (!empty($login))
self::$instance = new USER ($login);
elseif (empty(self::$instance))
self::$instance = new USER ($_SESSION['login']);
return self::$instance;
}
public function ajouter_au_panier($id,$qte) {
if (isset($this->panier->{"id".$id})) {
$this->panier->{"id".$id} += $qte;
} else $this->panier->{"id".$id} = $qte;
$this->backup_panier();
}
public function enlever_du_panier($id,$qte) {
if (isset($this->panier->{"id".$id})) {
$this->panier->{"id".$id} -= $qte;
if ($this->panier->{"id".$id}<=0)
$this->panier->remove("id".$id);
}
$this->backup_panier();
}
private function backup_panier() {
if (!empty($this->panier)) {
$panier = serialize($this->panier);
$_SESSION['cart'] = $panier;
} else unset ($_SESSION['cart']);
}
public function __destruct () {
$this->backup_panier();
}
}
?> |
et le lieu du crime:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
<?php
require ("inc/panier.class.php");
require ("inc/user.class.php");
session_start();
require ("include.php"); // le reste du programme.
/* ..
reste de la page
.. */
$user = USER::getMe();
echo "<pre>";print_r($_SESSION);echo"</pre>";
/*
* Et cette ligne ci dessu, donne ( le drame !) :
* [ ...blabla..]
* [cart] => O:8:"stdClass":1:{s:4:"id26";i:1;} <-- StdClass :'-(
* [..blabla..]
*
*/
?> |
Donc si quelqu'un pouvait m'aider, ou m'indiquer un piste de recherche, quelque chose..
Merci par avance.
Cordialement, Damien.