Мне было интересно, знает ли кто-нибудь, есть ли анонимные функции PHP для сбора мусора?
Я знаю, что функции, созданные с помощью create_function
, не собираются с мусором, но я не смог найти ссылки на те, которые были созданы с помощью синтаксиса function(){}
(внутренне представленного как объект Closure).
Сборщик мусора PHP не различает типы «вещей» – если у него есть хотя бы одна ссылка где-то, она сохраняется. В тот момент, когда это не применяется, ресурс собран из мусора.
Это не то же самое, что использовать create_function
, так как PHP добавляет ссылку create_function в глобальную область действия помимо ссылки на нее. Закрытие (объект Closure, если вы предпочитаете, поскольку это то, что они есть!) Существует только в области, в которой он был создан, в + все, к которым вы передаете.
Если вы хотите убедить себя в этом, запустите этот маленький кусок кода:
<?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(); }
Вы получите ровно одно эхо. Замените назначение $k
на create_function, и вы получите 100.
Вы можете увидеть xdebug_debug_zval ('a'); если установлен xdebug. http://www.php.net/manual/en/features.gc.refcounting-basics.php