참조는 무엇을 하는가
PHP 참조는 두 변수가 같은 내용을 참조할수 있게 한다. 다음과 같은 일을 한다:
$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 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 - 반복한 배열의 마지막 원소
?>
참조가 하는 두번째 일은 참조에 의해 변수를 전달하는 것이다. 이는
함수에서 지역 변수를 만들거나 같은 내용을 참조하는 호출을 사용하는 변수를
생성함으로써 가능해진다. 예를 들면:
위 코드는
$a를 6으로 만들것이다. 이렇게 되는 이유는
foo함수 안의 변수
$var가
$a와 같은 내용을 가리키기 때문이다. 이에 대한 정보는
참조에 의한 전달
섹션을 읽어보십시오.
참조가 하는 세번째 일은 참조에 의해 돌려받기이다.