개요
PHP의 많은 문법 구조는 내부적으로 참조(reference) 메커니즘을 통해 구현됩니다. 중요한 특징 중 하나는, 함수 내부에서 unset()을 사용하여 전역 변수에 대한 참조를 해제하더라도 전역 네임스페이스에 존재하는 원래 변수 자체는 삭제되지 않는다는 점입니다. 즉, 참조만 끊어질 뿐 원본 변수는 그대로 유지됩니다.
예제 코드
아래 예제는 함수 안에서 전역 변수를 참조하고, 값을 변경한 뒤 참조를 해제하는 과정을 보여줍니다.
<?php
$var1 = 'Hello World';
function myfunction(){
global $var1;
$var2 =&$var1;
echo "$var1, $var2 \n";
$var2="Hello PHP";
echo "$var1, $var2 \n";
unset($var1);
}
myfunction();
echo "$var1\n";
?>
실행 결과
함수 내에서 unset($var1)이 호출되었지만, 이는 함수 스코프 내의 지역 참조만 제거하는 것이므로 전역 변수 $var1은 그대로 유지됩니다.
Hello World, Hello World Hello PHP, Hello PHP Hello PHP
참조 상태 확인 방법
특정 변수가 다른 변수들과 참조 관계에 있는지 확인하고 싶다면 debug_zval_dump() 함수를 활용할 수 있습니다. 이 함수는 변수의 내부 zval 구조 정보(값, 데이터 타입, refcount 등)를 출력해 주므로, 참조가 어떻게 공유되고 있는지 디버깅할 때 매우 유용합니다.