Являются объектами PHP Closure, подходящими для сбора мусора

Мне было интересно, знает ли кто-нибудь, есть ли анонимные функции 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