update : 2015.11.03
php.shukuma.com

검색:
 
 
참조는 무엇을 하는가

참조는 무엇을 하는가

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(
123) as $row) {
    
// do something
}
echo 
$ref// 3 - 반복한 배열의 마지막 원소
?>

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

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

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

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