Il a été mentionné dans la page du manuel non défini en 2009 :
unset()
fait exactement ce que son nom dit - désinstaller une variable. Il ne force pas la libération immédiate de la mémoire. Le garbage collector de PHP le fera quand bon lui semblera - par intention dès que ces cycles de CPU ne sont pas nécessaires de toute façon, ou aussi tard qu'avant, le script manquerait de mémoire, quoi qu'il arrive en premier.
Si vous le faites, $whatever = null;
vous réécrivez les données des variables. Vous pouvez obtenir de la mémoire libérée / rétrécie plus rapidement, mais cela peut voler les cycles du processeur du code qui en a vraiment besoin plus tôt, ce qui entraîne un temps d'exécution global plus long.
(Depuis 2013, cette unset
page de manuel n'inclut plus cette section)
Notez que jusqu'à php5.3, si vous avez deux objets en référence circulaire , comme dans une relation parent-enfant, appeler unset () sur l'objet parent ne libérera pas la mémoire utilisée pour la référence parent dans l'objet enfant. (La mémoire ne sera pas non plus libérée lorsque l'objet parent est récupéré.) ( Bogue 33595 )
La question " différence entre unset et = null " détaille quelques différences:
unset($a)
supprime également $a
de la table des symboles; par exemple:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Les sorties:
Notice: Undefined variable: a in xxx
NULL
Mais quand $a = null
est-il utilisé:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Il semble que $a = null
c'est un peu plus rapide que son unset()
homologue: la mise à jour d'une entrée de table de symboles semble être plus rapide que sa suppression.
- lorsque vous essayez d'utiliser un élément inexistant (
unset
variable ), une erreur sera déclenchée et la valeur de l'expression de variable sera nulle. (Parce que, quoi d'autre PHP devrait-il faire? Chaque expression doit donner une certaine valeur.)
- Une variable avec null lui est cependant toujours une variable parfaitement normale.
$whatever
pointe vers un objet,$whatever = null
remplace le pointeur, pas l'objet lui-même, il agit donc de la même manière queunset()
.