참조는 무엇을 하는가?

참조를 사용하여 수행되는 세 가지 기본 작업이 있습니다: 참조에 의한 할당, 참조에 의한 전달, 참조에 의한 반환. 이 섹션에서는 더 읽을 수 있는 링크와 함께 이러한 작업에 대한 소개를 제공합니다.


참조로 할당

이들 중 첫 번째에서 PHP 참조를 사용하면 두 개의 변수가 동일한 내용을 참조하도록 할 수 있습니다.

                  
<?php
$a =& $b;
?>
                  
                

$a$b가 같은 내용을 가리킨다는 것을 의미합니다.

메모: $a$b는 여기서 완전히 같습니다. $a$b를 가리키지 않거나 그 반대의 경우도 마찬가지입니다. $a$b는 같은 곳을 가리키고 있습니다.

메모: 참조로 정의되지 않은 변수를 할당, 전달 또는 반환하면 생성됩니다.

예제 #1 정의되지 않은 변수와 함께 참조 사용

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

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
                    
                  

참조를 반환하는 함수에 동일한 구문을 사용할 수 있습니다.

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

참조에 의해 반환되지 않는 함수에 동일한 구문을 사용하면 오류가 발생하고 new 연산자의 결과와 함께 사용하면 오류가 발생합니다. 객체는 포인터로 전달되지만 객체 및 참조에 설명된 대로 참조와 동일하지 않습니다.

경고 함수 내에서 global으로 선언된 변수에 참조를 할당하면 참조는 함수 내에서만 볼 수 있습니다. $GLOBALS 배열을 사용하여 이를 방지할 수 있습니다.

예제 #2 함수 내 전역 변수 참조

                    
<?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'
?>
                    
                  

global $var;에 대해 생각해 보십시오. $var =& $GLOBALS['var'];의 바로 가기로. 따라서 $var에 다른 참조를 할당하면 지역 변수의 참조만 변경됩니다.

메모: foreach 문에서 참조가 있는 변수에 값을 할당하면 참조도 수정됩니다.

예제 #3 참조 및 foreach 문

                    
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
    // do something
}
echo $ref; // 3 - last element of the iterated array
?>
                    
                  

엄격하게 참조에 의한 할당은 아니지만 언어 구성 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); */
?>
                  
                

그러나 배열 내부의 참조는 잠재적으로 위험합니다. 오른쪽에 참조가 있는 일반(참조가 아님) 할당을 수행하면 왼쪽이 참조로 바뀌지 않지만 배열 내부의 참조는 이러한 일반 할당에서 보존됩니다. 이는 배열이 값으로 전달되는 함수 호출에도 적용됩니다. 예시:

                  
<?php
/* Assignment of scalar variables */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c is not a reference; no change to $a or $b

/* 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! */
?>
                  
                

즉, 배열의 참조 동작은 요소별로 정의됩니다. 개별 요소의 참조 동작은 배열 컨테이너의 참조 상태에서 분리됩니다.


참조로 전달

참조가 하는 두 번째 일은 참조로 변수를 전달하는 것입니다. 이것은 함수의 지역 변수와 동일한 내용을 참조하는 호출 범위의 변수를 만들어 수행됩니다. 예시:

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

$a=5;
foo($a);
?>
                  
                

$a를 6으로 만듭니다. 이것은 foo 함수에서 $var 변수가 $a와 동일한 내용을 참조하기 때문에 발생합니다. 이에 대한 자세한 내용은 참조로 전달 섹션을 참조하세요.


참조로 반환

참조가 할 수 있는 세 번째 일은 참조로 반환하는 것입니다.