2013-05-17 3 views
4

PHP의 익명 함수가 가비지 컬렉션을받을 수있는 경우 누군가가 알고 있다면 궁금 해서요을받을 수 개체?있습니다 PHP 폐쇄는 가비지 컬렉션

나는 create_function로 생성 기능이 쓰레기 수집 아니라는 것을 알고 있지만 나는 (내부적으로 폐쇄 객체로 표현)를 function(){} 구문을 만든 사람에 대한 참조를 찾을 수 없어.

답변

10

PHP의 가비지 컬렉터는 "일"의 종류를 구별하지 않습니다 - 그것은 어딘가에 적어도 하나의 참조가있는 경우, 그것은 유지됩니다. 이것이 적용되지 않는 순간 자원은 가비지 수집됩니다. 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(); 
} 

당신은 정확히 하나의 반향을 얻을 것이다. create_function와 $k 할당을 교체하고 오프 주제와 잘못된 추론 (100)

+0

좋은 설명. 그것은 객체이므로 PHP가 범위를 벗어나서 PHP가 올바른 일을 할 것이라고 생각했습니다. – Orangepill

+0

@Orangepill : PHP가 슬프게도 항상 옳은 일을하는 것은 아닙니다. 포인트는 남았고,'create_function' ='eval'. –

+0

현재 작업하고있는 프로젝트에서'create_function'을 nix화할 방법을 찾고 있습니다 만, 그 주위에 어떤 방법도 보이지 않습니다. 어떤지도 감사하겠습니다 당신은 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

를 얻을 수 있습니다 : 가장 간단한 경우를 제외한 모든에서, 제안 된 방법은 잘못된 공제로 이어질 수 있습니다. 테스트 케이스에서 메모리가 누출되면 잘못된 결론이 도출됩니다. –