참조가 하는 일

참조가 하는 일

이 페이지에서는 참조(reference)로 수행하는 세 가지 기본 연산, 즉 참조로 할당(assign by reference)·참조로 전달(pass by reference)·참조로 반환(return by reference)을 소개합니다. 각각의 동작 방식과 주의점을 코드 예시와 함께 살펴봐요.

출처: What References Do

본문

참조를 사용해 수행하는 기본 연산은 세 가지가 있어요. 바로 참조로 할당(assign by reference), 참조로 전달(pass by reference), 그리고 참조로 반환(return by reference)입니다. 이 절에서는 이 연산들을 소개하고, 더 자세한 내용을 볼 수 있는 링크를 함께 달아 둘게요.

참조로 할당

이 중 첫 번째로, PHP 참조는 두 변수가 같은 내용을 가리키게 만들 수 있어요. 즉 다음처럼 할 때를 말하죠.

<?php
$a =& $b;

같은 문법은 참조를 반환하는 함수에도 사용할 수 있습니다.

<?php
$foo =& find_var($bar);

참조로 반환하지 않는 함수에 같은 문법을 쓰면 오류가 나요. new 연산자의 결과에도 마찬가지로 쓰면 오류가 발생합니다. 객체는 포인터처럼 전달되긴 하지만, 이는 참조와는 달라요. 자세한 내용은 객체와 참조에서 설명합니다.

함수 안에서 global로 선언한 변수에 참조를 할당하면, 그 참조는 함수 안에서만 보여요. 이 문제를 피하려면 $GLOBALS 배열을 사용하면 됩니다.

<?php
$var1 = "Example variable";
$var2 = "";

function global_references($use_globals)
{
    global $var1, $var2;

    if (!$use_globals) {
        $var2 =& $var1; // visible only inside the function
    } else {
        $GLOBALS["var2"] =& $var1; // visible also in global context
    }
}

global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to ''

global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'

엄밀히 참조로 할당하는 것은 아니지만, 언어 구조 array() 로 만든 표현식도 배열 요소 앞에 &를 붙여 추가하면 그처럼 동작할 수 있어요. 예시를 볼게요.

<?php
$a = 1;
$b = array(2, 3);

$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++;
$arr[1]++;
$arr[2]++;
/* $a == 2, $b == array(3, 4); */
var_dump($a);
var_dump($b);

그런데 배열 안의 참조는 잠재적으로 위험할 수 있다는 점을 명심하세요. 오른쪽에 참조가 있는 상태에서 일반적인(참조가 아닌) 할당을 해도 왼쪽이 참조가 되지는 않지만, 배열 안의 참조는 이런 일반 할당에서도 보존됩니다. 이는 배열을 값으로 전달하는 함수 호출에도 적용돼요. 예시를 볼게요.

<?php

/* Assignment of scalar variables */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; // $c is not a reference; no change to $a or $b
print "a = {$a}; b = {$b}; c = {$c}\n\n";

/* Assignment of array variables */
$arr = array(1);
$a =& $arr[0]; // $a and $arr[0] are in the same reference set
$arr2 = $arr; // Not an assignment-by-reference!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* The contents of $arr are changed even though it's not a reference! */
print "a = {$a}\n";
var_dump($arr);
var_dump($arr2);

참조로 전달

참조가 하는 두 번째 일은 변수를 참조로 전달하는 것이에요. 함수 안의 지역 변수와 호출한 쪽의 변수가 같은 내용을 가리키게 만드는 것이죠. 예시를 볼게요.

<?php
function foo(&$var)
{
    $var++;
}

$a = 5;
foo($a);
print $a;

참조로 반환

참조가 할 수 있는 세 번째 일은 참조로 반환(return by reference)하는 것입니다. 자세한 내용은 참조 반환 문서를 참고하세요.

더 알아보기