변수명과 변수값은 다릅니다. 그래서 변수명은 서로 달라도 같은 내용(변수값)을 가질 수 있습니다.

참조 연산자는 서로 다른 변수명에 변수내용을 그대로 복사할 수 있게 해줍니다.

<?php

 $a = 1; 
 $b = 2; 
 $d = 3; 
 // $c 변수에 $b변수를 복사(참조)해 둡니다. 
 // 그래서 $c 변수와 $b 변수는 각각 2를 가지게 되었습니다. 
 $c = &$b; 
 // $c 변수와 $d 변수에 5를 대입합니다. 
 $c = $d = 5; 

 echo $c; // 결과: 5 
 echo "<br/>"; 
 echo $b; // 결과: 5 
 echo "<br/>"; 

 echo $d; // 결과: 5 
 echo "<br/>"; 

 // $c 참조 변수에 8을 대입합니다. 
 $c = 8; 

 echo $c; // 결과: 8 
 echo "<br/>"; 
 // $c의 참조가 $b이므로 동일 값을 가지게 됩니다. 
 echo $b; // 결과: 8 
 echo "<br/>"; 

 // $d 변수는 단순히 5를 대입한 것이므로 참조가 아닙니다. 
 echo $d; // 결과: 5 
 ?>

<?php 
 $a = 1; 
 $b = $a; 
 $c = &$a; 

 echo $b; // 결과: 1 
 echo $c; // 결과: 1 

 // 참조 변수에 5를 대입해 보겠습니다. 
 $a = 5; 

 echo $b; // 결과: 1 
 echo $c; // 결과: 5 
 ?>

참조란 $a와 $c는 완전히 동일한 작용을 하게 합니다.

이는 대입 연산자나 가변 변수와는 다릅니다. 전역변수의 참조를 보면 흥미로운 결과를 볼 수 있습니다.

<?php 
 // http://127.0.0.1/test.php?var=test&php=habony&monster=write 로 
 // GET을 넘겼을 때의 예입니다. 

 print_r($_GET); 
 /* 
 결과: 
 Array 
 ( 
    [var] => test 
    [php] => habony 
    [monster] => write 
 ) 
 */ 

 // $_GET 변수를 $var 변수에 참조하면 같은 결과물을 얻을 수 있습니다. 

 $var = &$_GET; 
 print_r($var); 
 /* 
 결과: 
 Array 
 ( 
    [var] => test 
    [php] => habony 
    [monster] => write 
 ) 
 */ 
 ?>

함수 내에서도 참조할 수 있습니다.

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

 $a = 5; 
 foo($a); // 결과: 6 


 function bar(){ 
      $a = &$GLOBALS['var']; 
      $a = "test"; 
      return $a; 
 } 

 $var = 5; 

 echo bar(); // 결과: test 
 echo "<br/>"; 

 echo $var; // 결과: test 
 ?>

함수 내의 참조는 함수 내에서만 동작합니다. 다음 예를 보겠습니다.

<?php 
 function bar(){ 
      $a = &$var; 
      $a = "test"; 
      return $a; 
 } 

 $var = 5; 

 echo bar(); // 결과: test 
 echo "<br/>"; 

 echo $var; // 결과: 5 
 ?>

다음은 참조의 해제입니다.

<?php 
 $a = 1; 
 $b = &$a; 
 unset($a); // $a 변수의 삭제 

 echo $b; // 결과: 1 

 // unset으로 $a와 $b사이의 연결만을 끊습니다. 
 // $a에 대입한 것이므로 결과물은 참조하지 않습니다. 
 $a = 5; 

 echo $b; // 결과: 1 
 ?>

이중 참조로 다른 결과물을 얻을 수 있습니다.

<?php 
 $a = 1; 
 $b = &$a; 
 $c = &$a; 
 unset($a); // $a 변수의 삭제 

 echo $b; // 결과: 1 

 // 5를 대입하여 새로운 결과값을 얻습니다. 
 $b = 5; 

 echo $b; // 결과: 5 
 echo $c; // 결과: 5 
 ?>

0 댓글