개요
PHP에서는 변수 이름을 동적으로 설정할 수 있는 강력한 기능을 제공합니다. 이를 가변 변수(Variable Variables)라고 부르며, 기존 변수에 저장된 값을 새로운 변수의 이름으로 활용하는 방식입니다.
가변 변수는 달러 기호($)를 두 개 연속으로 붙여서 정의합니다. 즉, $$변수명 형태로 작성하면 해당 변수의 값이 새로운 변수의 이름이 됩니다.
기본 예제
<?php
$var1="xyz"; // 일반 변수
$$var1="abcd"; // 가변 변수
echo $var1 . "\n";
echo $$var1 . "\n";
echo "{$$var1} $xyz";
?>실행 결과
위 스크립트를 실행하면 다음과 같은 결과가 출력됩니다.
xyz abcd abcd abcd
여기서 주목할 점은 $$var1의 값이 $xyz와 동일하다는 것입니다. $var1의 값이 "xyz"이므로, $$var1은 곧 $xyz와 같은 의미를 갖습니다.
숫자 값은 가변 변수로 사용 불가
일반 변수에 저장된 값이 숫자인 경우에는 가변 변수의 이름으로 사용할 수 없습니다. PHP 변수 이름은 반드시 문자 또는 밑줄(_)로 시작해야 하기 때문입니다.
예제
<?php $var1=100; // 일반 변수 $$var1=200; // 가변 변수 시도 echo $var1 . "\n"; echo $$var1 . "\n"; echo $100; ?>
실행 결과
이 스크립트를 실행하면 다음과 같은 파싱 에러가 발생합니다.
PHP Parse error: syntax error, unexpected '100' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$' line 6숫자로 시작하는 변수 이름은 PHP 문법상 허용되지 않으므로, 위와 같은 구문 오류(Parse Error)가 발생하게 됩니다.
배열 요소를 활용한 가변 변수
배열의 특정 요소 값을 이용해서도 가변 변수를 정의할 수 있습니다. 다음 예제에서는 일반 배열의 0번째 요소를 가변 변수의 이름으로 사용하고 있습니다.
예제
<?php
$var1=array("aa","bb"); // 일반 변수(배열)
${$var1[0]}=10; // 배열 요소를 이용한 가변 변수
echo $var1[0] . "\n";
echo $aa . "\n";
echo ${$var1[0]} . "\n";
?>실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
aa 10 10
배열의 0번째 요소 값이 "aa"이므로, ${$var1[0]}은 $aa와 동일한 변수를 참조하게 됩니다.
클래스 속성에 대한 가변 접근
클래스의 속성(property) 역시 가변 속성 이름을 통해 접근할 수 있습니다. 이 기능은 속성 이름이 배열에 저장되어 있거나 동적으로 결정되어야 하는 경우에 특히 유용합니다.
예제
<?php
var $u = "Architecture";
var $ugCourses = array("CSE","MECH","CIVIL");
$obj = new branches();
$courses = "ugCourses";
echo $obj->{$courses[0]} . "\n";
echo $obj->{$courses}[0] . "\n";
?>실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Architecture CSE
$obj->{$courses}처럼 중괄호({})를 사용하면 변수에 담긴 문자열을 속성 이름으로 해석하여 클래스 멤버에 동적으로 접근할 수 있습니다.
마무리
가변 변수는 코드를 유연하게 작성할 수 있게 해주는 PHP만의 독특한 기능입니다. 다만 남용하면 코드의 가독성과 유지보수성이 떨어질 수 있으므로, 동적 변수 이름이 꼭 필요한 상황에서 적절히 활용하는 것이 좋습니다.