Se mencionó en la página del manual sin configurar en 2009 :
unset()hace exactamente lo que dice su nombre: desarmar una variable. No fuerza la liberación inmediata de memoria. El recolector de basura de PHP lo hará cuando lo crea conveniente, por intención tan pronto como esos ciclos de CPU no sean necesarios de todos modos, o tan tarde como antes de que el script se quede sin memoria, lo que ocurra primero.
Si lo está haciendo $whatever = null;, está reescribiendo los datos de la variable. Es posible que la memoria se libere / reduzca más rápido, pero puede robar ciclos de CPU del código que realmente los necesita antes, lo que resulta en un tiempo de ejecución general más largo.
(Desde 2013, esa unsetpágina de manual ya no incluye esa sección)
Tenga en cuenta que hasta php5.3, si tiene dos objetos en referencia circular , como en una relación padre-hijo, llamar a unset () en el objeto padre no liberará la memoria utilizada para la referencia padre en el objeto hijo. (Tampoco se liberará la memoria cuando se recolecte basura el objeto principal.) ( Error 33595 )
La pregunta " diferencia entre unset y = nulo " detalla algunas diferencias:
unset($a)también elimina $ade la tabla de símbolos; por ejemplo:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Salidas:
Notice: Undefined variable: a in xxx
NULL
Pero cuando $a = nullse usa:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Parece que $a = nulles un poco más rápido que su unset()contraparte: actualizar una entrada de la tabla de símbolos parece ser más rápido que eliminarla.
- cuando intente utilizar una
unsetvariable no existente ( ), se activará un error y el valor de la expresión de la variable será nulo. (Porque, ¿qué más debe hacer PHP? Cada expresión debe tener algún valor).
- Sin embargo, una variable con nulo asignado sigue siendo una variable perfectamente normal.
$whateverapunta a un objeto,$whatever = nullsobrescribe el puntero, no el objeto en sí mismo, por lo que actúa básicamente igual queunset().