PHP에서 'use' 키워드를 사용하면 익명 함수(클로저)의 스코프 안으로 외부 변수를 바인딩할 수 있습니다. 익명 함수는 기본적으로 부모 스코프의 변수에 자동으로 접근하지 못하기 때문에, 필요한 변수를 use 키워드로 명시적으로 상속받아야 합니다.
핵심 동작 원리
use로 상속된 변수의 값은 함수가 호출되는 시점이 아니라 정의되는 시점을 기준으로 캡처됩니다. 또한 기본적으로 값이 복사되어 전달되며, 앰퍼샌드(&)를 붙여 참조로 전달하면 부모 스코프에서의 변경 사항이 함수 내부에 그대로 반영됩니다.
예제 코드
<?php
$message = 'hello there';
// use 없이 정의: $message에 접근할 수 없음
$example = function () {
var_dump($message);
};
$example();
// use 키워드로 $message 상속
$example = function () use ($message) {
var_dump($message);
};
$example();
// 상속된 값은 함수가 '정의된 시점'의 값임
$message = 'Inherited value';
$example();
$message = 'reset to hello'; // 값 재설정
// 참조(&)로 상속
$example = function () use (&$message) {
var_dump($message);
};
$example();
// 부모 스코프에서 변경한 값이
// 함수 호출 시 그대로 반영됨
$message = 'change reflected in parent scope';
$example();
// 선언된 매개변수가 없으면 전달된 인자는 무시됨
$example("hello message");
?>
실행 결과
NULL string(11) "hello there" string(11) "hello there" string(14) "reset to hello" string(32) "change reflected in parent scope" string(32) "change reflected in parent scope"
단계별 설명
- 첫 번째 호출:
use없이 정의된 함수이므로 내부에서$message에 접근할 수 없고,NULL이 출력됩니다. - 두 번째 호출:
use ($message)로 변수를 상속했기 때문에 "hello there"가 출력됩니다. - 세 번째 호출:
$message값을 바꿨지만 상속된 값은 함수 정의 시점에 고정되므로 여전히 "hello there"가 출력됩니다. - 네 번째 호출: 값을 "reset to hello"로 되돌린 뒤 함수를 새로 정의하고 참조(
&$message)로 상속했습니다. 따라서 현재 값이 그대로 출력됩니다. - 다섯 번째 호출: 참조로 상속되었으므로 부모 스코프에서 값을 변경하면 함수 호출 시 변경 내용이 실시간으로 반영됩니다.
마무리 정리
use키워드는 익명 함수에 외부 변수를 바인딩하는 방법입니다.- 기본 전달 방식은 값 복사이며, 함수가 정의된 시점의 값이 사용됩니다.
use (&$var)형태로 참조 전달을 하면 부모 스코프의 변경 사항이 함수 내부에 반영됩니다.