PHP 8.6 Closure 최적화
핵심 내용
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으로 바꾸지 않는다.$$varFoo::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()는 explicitlystatic인 closure에는 기존처럼 실패하지만, 추론으로 static이 된 closure에는 객체를 넘겨도 허용하되 무시한다.
투표는 24:0:1로 통과됐고, 대상은 PHP 8.6이다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.