Le ramasseur de déchets de PHP ne fait pas de distinction entre les types de "choses" - si elle a au moins une référence quelque part, elle est conservée. Dès que ce n'est pas le cas, la ressource est mise à la poubelle.
C'est no c'est la même chose que d'utiliser create_function
En effet, PHP jette la référence de la fonction create_function dans la portée globale en plus de la référencer. Une fermeture (un objet Closure, si vous préférez, car c'est ce qu'ils sont !) n'existe que dans la portée dans laquelle elle a été créée + toutes celles auxquelles vous la passez.
Si vous voulez vous en convaincre, exécutez ce petit bout de code :
<?php
$r = memory_get_usage();
for ($i = 0; $i < 100; $i++) {
$k = function() {echo "boo"; };
if (memory_get_usage() > $r) {
echo "Different memory count. Off by: ".(memory_get_usage() -$r);
}
$r = memory_get_usage();
}
Vous obtiendrez exactement un écho. Remplacez le $k
avec create_function, et vous obtiendrez 100.