AI Briefing

PHP 8.6 Closure 최적화

·2026.04.14 19:59

핵심 내용

PHP 8.6에 closure static 추론과 재사용 캐시가 들어간다.

자세히 보기

PHP 8.6 RFC로 closure 최적화 2가지가 제안됐고, 성능 향상을 위해 일부 BC break를 감수하는 방향이다.

  • Static closure inference: $this를 실제로 쓰지 않는 non-static closure를 자동으로 static으로 간주한다.

  • 이렇게 되면 불필요한 $this 캡처와 객체-closure 참조 순환을 줄일 수 있다.

  • 다만 추론은 완전하지 않으며, 다음처럼 간접적으로 $this가 흐를 가능성이 있으면 static으로 바꾸지 않는다.

    • $$var
    • Foo::bar() 같은 정적 호출처럼 보이지만 인스턴스 호출로 해석될 수 있는 경우
    • $f()
    • call_user_func()
    • 내부에서 또 다른 비-static closure를 선언하는 경우
    • require, include, eval
  • Symfony Demo에서 명시적 static을 제거한 뒤 테스트했을 때, 87개 중 68개(약 78%) closure를 자동 추론할 수 있었다.

  • Stateless closure caching: static이고, 어떤 변숫값도 캡처하지 않으며, static 변수도 선언하지 않는 closure는 재사용 캐시에 저장한다.

  • 같은 렉시컬 위치에서 만들어진 동일한 closure를 매번 새로 생성하지 않으므로, 매우 단순한 벤치마크에서는 약 80% 개선이 관찰됐다.

  • Laravel template에서는 3637개 중 2384개 closure instantiation을 줄여, 로컬 측정 기준 약 3% 성능 향상이 나왔다.

Backward incompatible change도 정리했다.

  • ReflectionFunction::getClosureThis()는 추론된 static closure에서 NULL을 반환한다.
  • 같은 렉시컬 위치에서 생성된 stateless closure 두 개는 이제 동일한 객체처럼 취급될 수 있다.
  • 예전에는 순환 참조 때문에 늦게 수거되던 객체가 더 빨리 GC 되고, 그에 따라 destructor도 더 일찍 실행될 수 있다.
  • Closure::bind()와 Closure::bindTo()는 explicitly static인 closure에는 기존처럼 실패하지만, 추론으로 static이 된 closure에는 객체를 넘겨도 허용하되 무시한다.

투표는 24:0:1로 통과됐고, 대상은 PHP 8.6이다.

이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.

AI 처리 방식을 확인하거나, 요약 오류와 출처 표기 문제, 삭제 요청을 문의 · 건의로 알려주세요.