2010-09-23 10 views
2

J'ai un objet, basé sur le design Singleton, que j'utilise pour l'authentification de l'utilisateur. Étant donné que l'objet est un objet par utilisateur, je souhaite que l'objet soit automatiquement stocké dans une variable de session à la fin de l'exécution. Cependant, chaque fois que j'essaie de sérialiser l'objet, que ce soit en interne ou en externe, j'obtiens une chaîne vide.Impossible de sérialiser un objet basé sur un singleton dans PHP

Ce qui suit est la classe de base, moins les fonctions non pertinentes:

<?php 
/** 
* The user class is intended to handle information about authenticated users. Information contained in this class is to be stored 
* in SESSION['session_user'] as a serialized object. 
*/ 
class User { 
// Reference to the single User instance 
private static $_instance; 
// User levels 
const GUEST = 0; 
const USER = 1; 
const ADMINISTRATOR = 3; 
// Information about the account 
private $_username; 
private $_userid; 
private $_userlevel; 
// Information about the user, for preventing session hijacking 
private $_ipaddress; 
private $_useragent; 

private function __construct() { 
    // Set the visitor's information 
    // Set the default information 
} 

public static function getUser() { 

    // Check if a user object has been created 
    if (!isset(self::$_instance)) { 
    // Check if the object is stored in the user session 
    if (isset($_SESSION['session_user'])) { 
    self::$_instance = unserialize($_SESSION['session_user']); 
    //unset($_SESSION['session_user']); 
    echo 'Unserializing user'; 
    } else { 
    $c = __CLASS__; 
    self::$_instance = new $c; 
    echo 'Creating new user'; 
    } 
} 
return self::$_instance; 
} 

function __wakeup() { 
// First, check that the user agent has not changed 
// Check that the IP has not changed 
} 

function __destroy() { 
$_SESSION['session_user'] = serialize(self::$_instance); 
echo serialize(self::$_instance); 
print_r($_SESSION); 
} 
public function __set($index, $value) { 
return NULL; 
} 
public function __get($index) { 
// Determine which value to return 
} 
public function authenticate($inUsername, $inPassword) { 
// Authenticate the user 
} 
} 
?> 

Chaque fois que j'appelle sérialisation sur l'objet, soit en interne dans la méthode __destroy serialize ($ this-) ou sérialisation (self :: $ _instance), ou de manière externe en utilisant serialize ($ user), j'obtiens une chaîne vide. Cependant, je sais que l'objet existe depuis que je peux obtenir des données sur un utilisateur authentifié.

+0

Ce n'est pas un Singleton quand il peut être sérialisé. – Gordon

Répondre

1

La fonction magique est appelée __destruct, et non __destroy. Fait;)

+0

En vérité, merci beaucoup. D'oh! – Wige

+0

Hehe, les noms sont si semblables/crédibles Je me grattais aussi la tête pendant la plus grande partie d'un quart d'heure pourquoi cela n'a pas fonctionné;) – Wrikken