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é.
Ce n'est pas un Singleton quand il peut être sérialisé. – Gordon