Unset PHP : Gérez la suppression de variables efficacement

En PHP, la fonction unset() sert à supprimer des variables, des éléments de tableaux ou des propriétés d’objets. Elle libère la mémoire associée et évite les conflits dans les scripts de longue durée. Cet article détaille sa signature et présente des cas d’usage concrets avec exemples de code.

Signature de la fonction unset PHP et ses paramètres

void unset ( mixed $var , mixed ...$vars )

La fonction unset()  ne renvoie aucune valeur, ce qui en fait une instruction plutôt qu’une fonction classique.​Cependant,il est toujours préférable de verifier si une variable existe avec la fonction isset() avant de consommer de la ressource serveur.

Le paramètre  permet de passer une variable ou une liste de variable à traiter en une seule instruction. La fonction ne génère aucune erreur si une variable n’existe pas au préalable.

Cette flexibilité permet à la fonction unset() de s’adapter à divers contextes, des variables globales aux structures complexes. Voici un exemple basique qui montre son fonctionnement sur une variable simple :

Cas d’usage pour supprimer des variables

Suppression d’une seule variable

La suppression d’une variable scalaire intervient souvent après un traitement lourd, comme la lecture d’un fichier ou un calcul intensif. Cela réduit la consommation mémoire dans les boucles ou les scripts batch.

<?php
// Lecture d'un fichier volumineux
$donneesImport = file_get_contents('export_5Mo.json');

// Traitement des données
$tableauTraite = json_decode($donneesImport, true);
$resultats = analyserTableau($tableauTraite);

// Suppression de la variable intermédiaire
unset($donneesImport);

echo memory_get_usage() . " octets utilisés après nettoyage.\n";
?>

Dans cet exemple, unset($donneesImport) libère immédiatement l’espace du fichier JSON chargé en mémoire, optimisant les ressources pour la suite du script.

Suppression de plusieurs variables simultanément

unset() accepte plusieurs arguments séparés par des virgules, ce qui permet un nettoyage groupé sans appels répétés. Cela convient aux fonctions temporaires qui génèrent de multiples variables locales.

<?php
// Simulation d'un traitement utilisateur complet
$profilUser = recupererProfil(456);
$historique = chargerHistorique($profilUser['id']);
$factures = listerFactures($profilUser['id']);

// Toutes les variables temporaires ne servent plus
unset($profilUser, $historique, $factures);

echo "Nettoyage effectué sur trois variables en une instruction.\n";
?>

Ce pattern accélère le code et clarifie l’intention de nettoyage après une phase de calcul.

Suppression d’une variable de tableau

Pour retirer un élément d’un tableau, spécifiez la clé entre crochets. Les autres clés restent inchangées, sans réindexation automatique.

<?php
// Tableau associatif représentant un panier
$panierArticles = [
    'ref001' => ['nom' => 'Ordinateur', 'prix' => 899],
    'ref002' => ['nom' => 'Écran', 'prix' => 299],
    'ref003' => ['nom' => 'Souris', 'prix' => 29]
];

// Suppression d'un article spécifique
unset($panierArticles['ref002']);

print_r($panierArticles);
// Résultat : ref001 et ref003 conservés avec leurs clés originales
?>

Cette méthode préserve l’intégrité des index, utile pour les identifiants uniques comme les références produits.

Suppression d’une variable d’un objet

unset() supprime les propriétés publiques d’un objet. Elle ne touche pas les propriétés privées ou protégées, qui nécessitent des méthodes dédiées.

<?php
class PanierSession {
    public $articles = [];
    public $total = 0;
    public $donneesCalcul = null;  // Temporaire pour calculs
    
    public function ajouterArticle($ref, $prix) {
        $this->articles[$ref] = $prix;
        $this->donneesCalcul = $this->calculerIntermediaire();
        $this->total = array_sum($this->articles);
    }
}

$panier = new PanierSession();
$panier->ajouterArticle('ref004', 150);

// Nettoyage de la propriété temporaire
unset($panier->donneesCalcul);

var_dump($panier);
// La propriété n'existe plus, articles et total conservés
?>

Ici, unset() cible uniquement les données de calcul intermédiaires, maintenant l’objet utilisable sans surcharge mémoire.

Exemples avancés d’unset avec des tableaux multidimensionnels

Suppression dans un tableau de données utilisateurs

Les tableaux multidimensionnels stockent souvent des données hiérarchiques comme des utilisateurs avec leurs commandes. unset() cible précisément les sous-éléments.

<?php
// Base de données utilisateurs simulée
$utilisateurs = [
    'user1' => [
        'nom' => 'Dupont',
        'commandes' => [
            ['id' => 101, 'montant' => 250],
            ['id' => 102, 'montant' => 180]
        ]
    ],
    'user2' => [
        'nom' => 'Martin', 
        'commandes' => [
            ['id' => 201, 'montant' => 95]
        ]
    ]
];

// Suppression d'une commande spécifique d'un utilisateur
unset($utilisateurs['user1']['commandes'][0]);

print_r($utilisateurs['user1']);
// Résultat : commande 101 supprimée, 102 conservée
?>

Ici, unset() navigue dans la hiérarchie utilisateurs → user1 → commandes → index 0 sans affecter les autres niveaux.

Nettoyage d’une branche entière

Supprimez un utilisateur complet avec toutes ses données associées en une instruction.Cette approche libère toute la mémoire de la branche supprimée.

<?php
$utilisateurs = [
    'user1' => ['nom' => 'Dupont', 'commandes' => [101, 102]],
    'user2' => ['nom' => 'Martin', 'commandes' => [201]],
    'user3' => ['nom' => 'Durand', 'commandes' => [301]]
];

// Suppression complète d'un utilisateur
unset($utilisateurs['user2']);

print_r(array_keys($utilisateurs));
// Résultat : user1, user3 (user2 effacé avec ses commandes)
?>

Suppression conditionnelle avec parcours récursif

Pour nettoyer dynamiquement selon des critères (ex: commandes expirées), combinez unset() avec array_walk_recursive().

<?php
$boutique = [
    'cat1' => [
        'produit1' => ['prix' => 50, 'stock' => 0],  // Rupture
        'produit2' => ['prix' => 75, 'stock' => 12]
    ],
    'cat2' => [
        'produit3' => ['prix' => 120, 'stock' => 0]  // Rupture
    ]
];

// Suppression récursive des produits en rupture
array_walk_recursive($boutique, function($valeur, $cle) use (&$boutique) {
    if ($cle === 'stock' && $valeur === 0) {
        // Remonter à la clé 'produit' parente
        $cles = array_keys($GLOBALS['chemin']);
        $parentKey = $cles[count($cles) - 2];
        unset($boutique[$cles[0]][$parentKey]);
    }
});

print_r($boutique);
?>

Nettoyage par référence de clés multiples

Supprimez simultanément des éléments à différents niveaux.

<?php
$site = [
    'pages' => [
        'accueil' => ['contenu' => 'texte', 'cache' => 'data1'],
        'contact' => ['contenu' => 'formulaire', 'cache' => 'data2']
    ],
    'stats' => ['visites' => 1500, 'cache' => 'stats2026']
];

// Nettoyage groupé des caches à différents niveaux
unset(
    $site['pages']['accueil']['cache'],
    $site['pages']['contact']['cache'],
    $site['stats']['cache']
);

print_r($site);
?>

Tableaux de sessions complexes

Nettoyage sélectif dans les paniers de session multi-niveaux.

<?php
$_SESSION['panier'] = [
    'client123' => [
        'articles' => [
            'refA001' => ['qté' => 2, 'prix' => 45],
            'refA002' => ['qté' => 1, 'prix' => 89]
        ],
        'infos' => ['nom' => 'Jean', 'total' => 179]
    ]
];

// Suppression d'un article spécifique d'un client
unset($_SESSION['panier']['client123']['articles']['refA002']);

echo $_SESSION['panier']['client123']['infos']['total']; 
// Recalculer après suppression
?>

Points clés :

  • unset() préserve les clés des autres éléments
  • Fonctionne sur toute profondeur de tableau
  • Références intactes : les autres variables pointant vers le même niveau ne sont pas affectées
  • Pour réindexer après suppression : array_values()

La fonction unset() s’intègre naturellement dans les workflows PHP pour une gestion mémoire contrôlée.

Sources: php.net

Cours

Variables et types

Manipulation de chaînes

Tableaux

Fichiers et système

Sécurité, session et cookie