Сборщик мусора PHP не различает типы «вещей» - если он имеет хотя бы одну ссылку где-то, она сохраняется. В тот момент, когда это не применяется, ресурс собран из мусора.
Это не такой же, как с помощью create_function
, поскольку РНР бросает ссылку 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.
хорошее описание. поскольку это объект, который, как я полагал, должен выпасть из сферы действия, а php сделает все правильно. – Orangepill
@Orangepill: PHP не всегда поступает правильно, к сожалению. Точка остается, 'create_function' =' eval'. –
Я в настоящее время ищу способ для nix 'create_function' из проекта, над которым я работаю, но я не вижу его. Был бы признателен за любые рекомендации, которые вы могли бы дать http://codereview.stackexchange.com/questions/26268/potential-problems-with-this-templating-technique – Orangepill