참조란 무엇인가
참조가 아닌 것
참조 표현
PHP Manual

## 참조는 무엇을 하는가

PHP 참조는 두 변수가 같은 내용을 참조할수 있게 한다. 다음과 같은 일을 한다:

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

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

> Note: 여기에서 $a와 $b는 완전히 동일합니다. $a는 $b를 가리키고, 그 반대일 수도 있습니다. $a와 $b는 같은 위치를 가리킵니다.

> Note: 참조를 가진 배열이 복사되면, 그 값들은 참조인 상태로 남습니다. 이는 배열이 함수에 값으로 넘겨졌을 때에도 유효합니다.

> Note: 정의되지 않은 변수를 참조를 통해 할당하거나, 넘기거나, 반환하면 변수가 생성됩니다.

> Example #1 정의되지 않은 변수에 참조 사용하기

> `<?php
> function foo(&$var) { }
> foo($a); // $a가 "생성되고" 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')); // boold(true)
> ?>`

같은 문법을 참조를 반환하는 함수나, new 연산자(PHP 4.0.4부터)에도 사용합니다.

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

PHP 5부터, new는 자동으로 참조를 반환하므로, 여기에서처럼 =&를 사용하는 것은 배제되었고 E_STRICT 등급 메세지를 발생합니다.

> Note: & 연산자를 사용하지않으면 생성된 객체의 복사본을 돌려받는다. 그 클래스에서 $this를 사용한다면 그것은 클래스의 현재 인스턴스에만 영향을 미친다. &가 없는 지정은 인스턴스(즉, 객체)를 복사할것이고 $this는 복사본에만 영향을 미칠것이다. 이와 같은 것은 퍼포먼스와 메모리의 효율적인 사용을 위해 오직 하나의 인스턴스만 취급하기를 원할 경우에 사용된다.
> @new처럼 생성자에서 발생하는 모든 에러 메시지를 보이지 않게 하기 위해서 @연산자를 사용할수 있지만, &new구문을 사용할때는 이 연산자는 작동하지 않는다. 이것은 젠드 엔진의 한계로 이런 표현을 쓰면 해석 오류가 발생한다.

Warning

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

Example #2 함수 안에서 전역 변수 참조하기

`<?php
$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if ($use_globals) {
$var2 =& $var1; // 함수 안에서만 보여집니다
} else {
$GLOBALS["var2"] =& $var1; // 전역 문맥에서도 보여집니다
}
}
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에 할당하는 것은 지역 변수의 참조를 변경할 뿐입니다.

> Note: foreach 구문 안에서 참조 변수에 값을 할당하면, 참조도 변경됩니다.

> Example #3 참조와 foreach 구문

> `<?php
> $ref = 0;
> $row =& $ref;
> foreach (array(1, 2, 3) as $row) {
> // do something
> }
> echo $ref; // 3 - 반복한 배열의 마지막 원소
> ?>`

참조가 하는 두번째 일은 참조에 의해 변수를 전달하는 것이다. 이는 함수에서 지역 변수를 만들거나 같은 내용을 참조하는 호출을 사용하는 변수를 생성함으로써 가능해진다. 예를 들면:

`<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>`

위 코드는 $a를 6으로 만들것이다. 이렇게 되는 이유는 foo함수 안의 변수 $var가 $a와 같은 내용을 가리키기 때문이다. 이에 대한 정보는 참조에 의한 전달 섹션을 읽어보십시오.

참조가 하는 세번째 일은 참조에 의해 돌려받기이다.

참조란 무엇인가
참조가 아닌 것
참조 표현
PHP Manual