logo oujood
🔍

La fonction unserialize() en PHP

OUJOOD.COM

Qu'est-ce que unserialize() ?

FONCTIONS PHP

La 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

📋 Copier le code

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 : false est retourné aussi bien en cas d'erreur que si la chaîne sérialisée représentait un booléen false. Pour distinguer les deux cas, comparez avec serialize(false).

Exemple 1 : restaurer un tableau

On linéarise un tableau avec serialize(), puis on le restaure avec unserialize().

📋 Copier le code

<?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.

📋 Copier le code

<?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'interface Serializable est dépréciée depuis PHP 8.1 et sera supprimée dans une future version.

Exemple 3 : gérer une chaîne invalide

📋 Copier le code

<?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 :

📋 Copier le code

<?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, passer true à allowed_classes déclenche une TypeError ou ValueError. La valeur doit être soit false, soit un tableau de noms de classes. Si vous voulez autoriser toutes les classes, omettez simplement l'option allowed_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 :
La fonction strval()

Fonctions de manipulation des variables en PHP

Cours suivant :
La fonction unset()

Par carabde – mis à jour mai 2026