OUJOOD.COM
Qu'est-ce que unserialize() ?
FONCTIONS PHPLa fonction unserialize() reconvertit une chaîne produite par serialize() en une variable PHP utilisable — tableau, objet, entier, booléen, etc. C'est l'opération inverse de la linéarisation : on reprend une chaîne compacte stockée en base de données ou dans un fichier, et on retrouve la structure d'origine.
Syntaxe
unserialize(string $data, array $options = []): mixed
Le paramètre $data est la chaîne linéarisée à convertir. Le tableau $options est facultatif et accepte une clé : allowed_classes, qui contrôle quelles classes peuvent être instanciées (voir section Sécurité).
La fonction retourne la valeur reconstituée de type mixed. Si la chaîne est invalide, elle retourne false et déclenche une alerte E_WARNING.
À noter :falseest retourné aussi bien en cas d'erreur que si la chaîne sérialisée représentait un booléenfalse. Pour distinguer les deux cas, comparez avecserialize(false).
Exemple 1 : restaurer un tableau
On linéarise un tableau avec serialize(), puis on le restaure avec unserialize().
<?php $notes = array(5, "3", "a", 5.2); // Linéarisation $var_serialise = serialize($notes); echo $var_serialise . '<br>'; // Résultat : a:4:{i:0;i:5;i:1;s:1:"3";i:2;s:1:"a";i:3;d:5.2;} // Restauration $restaure = unserialize($var_serialise); print_r($restaure); // Résultat : Array ( [0] => 5 [1] => 3 [2] => a [3] => 5.2 ) ?>
Exemple 2 : restaurer un objet — méthode __unserialize()
Depuis PHP 7.4, la méthode recommandée pour personnaliser la délinéarisation d'un objet est __unserialize(). Elle remplace l'ancien __wakeup() et l'interface Serializable, qui est dépréciée depuis PHP 8.1.
<?php
class Connexion {
public string $hote;
public int $port;
public function __unserialize(array $data): void {
$this->hote = $data['hote'];
$this->port = $data['port'];
echo "Connexion restaurée : {$this->hote}:{$this->port}<br>";
}
public function __serialize(): array {
return ['hote' => $this->hote, 'port' => $this->port];
}
}
$obj = new Connexion();
$obj->hote = "localhost";
$obj->port = 3306;
$chaine = serialize($obj);
$restaure = unserialize($chaine);
// Affiche : Connexion restaurée : localhost:3306
?>
Bonne pratique 2026 : Utilisez toujours la paire__serialize()/__unserialize()sur vos classes. L'interfaceSerializableest dépréciée depuis PHP 8.1 et sera supprimée dans une future version.
Exemple 3 : gérer une chaîne invalide
<?php
$chaine_invalide = "ceci_nest_pas_valide";
$resultat = unserialize($chaine_invalide);
if ($resultat === false) {
echo "Erreur : chaîne non valide.";
}
?>
Notez l'utilisation de === (comparaison stricte) et non ==, car unserialize() peut légitimement retourner false si la valeur sérialisée était elle-même un booléen false.
Sécurité et option allowed_classes
Ne passez jamais de données venant d'un utilisateur à unserialize(). La délinéarisation instancie des objets et déclenche des méthodes magiques — ce qui peut exécuter du code malveillant si la chaîne est forgée.
L'option allowed_classes permet de limiter les classes autorisées lors de la délinéarisation :
<?php // Aucune classe autorisée : sécurité maximale pour les données inconnues $data = unserialize($chaine, ['allowed_classes' => false]); // Seulement la classe Utilisateur est autorisée $data = unserialize($chaine, ['allowed_classes' => ['Utilisateur']]); ?>
Nouveauté PHP 8.4 : Depuis PHP 8.4, passertrueàallowed_classesdéclenche uneTypeErrorouValueError. La valeur doit être soitfalse, soit un tableau de noms de classes. Si vous voulez autoriser toutes les classes, omettez simplement l'optionallowed_classes.
Pour les données dont vous n'avez pas le contrôle total, préférez JSON via json_encode() / json_decode() — c'est plus sûr et interopérable.
Versions PHP et compatibilité (2026)
Les versions PHP actuellement maintenues sont PHP 8.2 (support sécurité jusqu'en décembre 2026), PHP 8.3 (jusqu'en décembre 2027) et PHP 8.4 (jusqu'en décembre 2028). PHP 8.1 n'est plus supporté depuis décembre 2025.
| Version | Changement lié à unserialize() |
|---|---|
| PHP 7.4 | Introduction de __serialize() / __unserialize() |
| PHP 8.1 | Interface Serializable dépréciée |
| PHP 8.3 | unserialize() émet désormais E_WARNING (au lieu de E_NOTICE) en cas d'erreur |
| PHP 8.4 | allowed_classes => true lève une TypeError / ValueError — utiliser un tableau ou omettre l'option |
|
Cours précédent : |
Cours suivant : |