참조가 아닌 것

참조가 아닌 것

이 페이지에서는 참조(reference)가 C 언어의 포인터처럼 동작하지 않는다는 점을 설명해요. 흔히 착각하기 쉬운, 참조로는 할 수 없는 동작을 코드와 함께 알아봅니다.

출처: What References Are Not

본문

앞서 말했듯이 참조는 포인터가 아니에요. 즉 다음처럼 작성하면 기대한 대로 동작하지 않습니다.

<?php
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}

foo($bar);

여기서 일어나는 일은 이래요. foo 안의 $var는 호출한 쪽의 $bar에 묶였다가(bound), 다시 $GLOBALS["baz"]에 다시 묶입니다. 참조 메커니즘으로는 호출하는 쪽의 $bar를 다른 무언가에 묶을 방법이 없어요. 왜냐하면 $bar는 함수 foo에서 사용할 수 없기 때문이죠. ($bar$var로 표현되지만, $var는 변수 내용만 가질 뿐 호출하는 쪽 심볼 테이블에서 이름-값 바인딩을 갖지 않습니다.) 함수가 선택한 변수를 참조하고 싶다면 참조 반환을 사용할 수 있어요.

더 알아보기