PHP 참조란 무엇인가?
PHP에서 참조(Reference)란 동일한 변수의 내용을 서로 다른 이름으로 접근할 수 있도록 해주는 기능입니다. 이름 그대로 변수에 '별명'을 붙여주는 개념이라고 이해하면 쉽습니다.
흔히 C나 C++의 포인터와 혼동하기 쉬운데, 둘은 완전히 다릅니다. C/C++에서 포인터는 실제 메모리 주소를 담고 있어 포인터 연산이 가능하지만, PHP의 참조는 메모리 주소가 아니라 심볼 테이블(symbol table)의 별칭(alias)입니다. 따라서 참조를 가지고 산술 연산을 수행하는 것은 불가능합니다.
PHP에서 변수 이름과 변수 내용은 별개로 취급되며, 하나의 내용이 여러 개의 이름을 가질 수 있습니다. 참조 변수는 원래 변수 앞에 &(앰퍼샌드) 기호를 붙여 생성합니다. 예를 들어 $b = &$a라고 작성하면 $b는 $a의 참조 변수가 되어, 두 변수는 같은 값을 공유하게 됩니다.
참조로 값 할당하기
다음 예제에서는 두 변수가 동일한 값을 참조하고 있습니다.
예제
<?php $var1=10; $var2=&$var1; echo "$var1 $var2\n"; $var2=20; echo "$var1 $var2\n"; ?>
실행 결과
한쪽 변수의 값이 변경되면 다른 쪽 변수에도 그 변경이 그대로 반영됩니다.
10 10 20 20
참고로, 정의되지 않은(undefined) 변수를 참조하여 할당, 전달 또는 반환하면 해당 변수가 자동으로 생성됩니다. 또한 함수 내부에서 global로 선언된 변수에 참조를 할당하면, 그 참조는 함수 내부에서만 유효합니다.
foreach 문에서의 참조 동작
foreach 문에서 참조가 설정된 변수에 값을 할당하면, 참조 대상인 변수의 값 역시 함께 수정됩니다.
예제
<?php $arr=[1,2,3,4,5]; $i=&$ref; foreach($arr as $i) echo $i*$i, "\n"; echo "ref = ". $ref; ?>
실행 결과
$ref 변수에는 배열의 마지막 요소 값이 저장됩니다. foreach 루프가 진행되면서 $i에 배열 요소가 차례대로 할당되는데, $i와 $ref가 같은 값을 공유하고 있기 때문입니다.
1 4 9 16 25 ref = 5
배열 요소를 변수의 참조로 만들기
다음 예제에서는 배열을 초기화하기 전에 선언된 개별 변수들을 배열 요소의 참조로 사용하고 있습니다. 배열 요소를 수정하면 원래 변수의 값도 함께 변경됩니다.
예제
<?php $a = 10; $b = 20; $c=30; $arr = array(&$a, &$b, &$c); for ($i=0; $i<3; $i++) $arr[$i]++; echo "$a $b $c"; ?>
실행 결과
배열 요소를 증가시켰지만, 참조 관계에 있는 $a, $b, $c의 값도 함께 증가한 것을 확인할 수 있습니다.
11 21 31