2013-05-17 2 views
4

Мне было интересно, знает ли кто-нибудь, есть ли анонимные функции PHP для сбора мусора?Являются ли объекты PHP Closure подходящими для сбора мусора

Я знаю, что функции, созданные с помощью create_function, не собираются с мусором, но я не смог найти ссылки на те, которые были созданы с помощью синтаксиса function(){} (внутренне представленного как объект Closure).

ответ

10

Сборщик мусора 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.

+0

хорошее описание. поскольку это объект, который, как я полагал, должен выпасть из сферы действия, а php сделает все правильно. – Orangepill

+0

@Orangepill: PHP не всегда поступает правильно, к сожалению. Точка остается, 'create_function' =' eval'. –

+0

Я в настоящее время ищу способ для nix 'create_function' из проекта, над которым я работаю, но я не вижу его. Был бы признателен за любые рекомендации, которые вы могли бы дать http://codereview.stackexchange.com/questions/26268/potential-problems-with-this-templating-technique – Orangepill

0

Вы можете видеть по xdebug_debug_zval ('a'); если установлен xdebug. http://www.php.net/manual/en/features.gc.refcounting-basics.php

+0

Непохожий и ошибочный аргумент: во всем, кроме простейшего случая, предложенный метод может привести к ошибочным выводам. Утечка памяти в тестовом случае приведет к неправильному выводу. –

Смежные вопросы