자유게시판

제목 PHP의 Returning Reference에 대하여..
글쓴이 mycastor 작성시각 2010/07/09 00:03:29
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 11528   RSS
음.. CI가 아니라서 그냥 자게에 올려봅니다.

PHP레퍼런스를 보는중 Returning Reference가 있는데요..

몇십분째 반복해서 보는데 도저히 이해가 안가네요..

너무 복잡하게 생각해서 일까요? 아님 머리가 나쁜걸까요? ㅜㅜ

http://www.tuxradar.com/practicalphp/4/15/4
http://theserverpages.com/php/manual/en/language.references.return.php

이해 되시는분은 살짝 코멘트좀 부탁드리겠습니다.

특히 아래 소스가 이해가 안가네요..

<?php

function    & func_b ()
{
   $some_var = 2;
   return $some_var;
}

function    func_a (& $param)
{
   # $param is 1 here
   $param = & func_b();
   # $param is 2 here
}

$var = 1;
func_a($var);
# $var is still 1 here!!!

?>
도움 부탁드립니다~~
 다음글 [취소]저녁에 맥주한잔 하실분? (7)
 이전글 궁하면 통한다고 (1)

댓글

mycastor / 2010/07/09 00:06:01 / 추천 0
& func_b ()의 리턴값은 의미가 없는건가봐요..

음 모르겠다.. ㅜㅜ
배강민 / 2010/07/09 10:10:12 / 추천 0

으.. 이해안돼... 머리아파....

문제는 $param = & func_b(); 여기서 &를 빼면 2가 떨어진다는것...

면접때 포인터 관련 질문에 답변 제대로 못했던 쓰라림이 떠오르는...

Max / 2010/07/09 14:30:16 / 추천 0
원문을 보면

"작은 예외가 있는데 참조형태로 리턴되는 함수의 결과(참조=reference)를 넘겨받는 값을 할당할때 참조바인딩(reference binding)이라고 나타내기위해 &를 사용할 필요 없다.."

라고 하네요.

즉,  아래에서는

<?php

function    & func_b ()
{
   
$some_var 2;
   return 
$some_var;
}

function    
func_a (& $param)
{
   
# $param is 1 here
   
$param = & func_b();
   
# $param is 2 here
}

$var 1;
func_a($var);
# $var is still 1 here!!!

?>

참조바인딩이라는걸 나타내기위해 &를 사용했는데  예상과 달리 2가 아닌 1일 떨어진다고... 이것이 작은 예외라고...

그래서 다음처럼  &을 빼고 해보니
<?php

function    & func_b ()
{
   
$some_var 2;
   return 
$some_var;
}

function    
func_a (& $param)
{
   
# $param is 1 here
   
$param func_b();
   
# $param is 2 here
}

$var 1;
func_a($var);
# $var is 2 here as intended

?>

예상데로 2가 떨어진다고 하네요..  따라서 참조바인딩(reference binding)이라고 나타내기위해 &를 사용할 필요 없다고...  자기도 겪은건데 왜 그런지는 언급 이 없네요..


-------

제 단견으로는 &를 사용하면 받는 함수에서는 참조를 받게되는데 & func_b()에선 참조를 던지는데, 호출 함수 func_a($var); 는 참조호출이 아닌 일반 호출이라 그 던진 참조를 인지못해서 첫번째 경우에 1을 그대로 유지하는것 같습니다.

다음과 같이 해보니 2가 떨어지네요..
function    & func_b ()
{
   $some_var = 2;
   return $some_var;
}
 
function    func_a (& $param)
{
   # $param is 1 here
   $param = & func_b();
   echo $param;
   # $param is 2 here
   return $param;
}
 
 
 
$var = 1;
$var1 = & func_a($var);
 
echo $var1;

즉 & func_a($var);처럼 여기에도 &를 사용하여 참조리턴을 했습니다.

두번째 경우는 $param =  func_b();처럼 & 빼고 호출한지라 당연히 값복사이고 또 func_a($var);처럼 일반적인 경우라서 따라서 2가 떨어집니다..

이글을 쓴 외국분은 예외라고 했는데 & func_a($var);처럼 &를 부쳐서 호울하면 2가 나오는거 보면 꼭 예외라 하기도 어려운것같습니다..



위의 내용은 단지 저의 추측일뿐 틀릴 확률이 80% 이상입니다..^^
그냥 이런 생각 하는 사람도 있다는 정도로..^^

더 큰 고견을.......


mycastor / 2010/07/09 15:11:46 / 추천 0
Max님 //
저걸 실제로 어떻게 사용할까 고민을 많이 했습니다.

아직도 갈팡질팡하고 해결이 안되었지만

그래도 Max님 덕에 많은 도움이 되었습니다.

친절한 설명 감사드립니다 ^^
mycastor / 2010/07/09 15:14:02 / 추천 0
강민형 //
저도 대학다닐때 포인터 때문에 C를 되게 겁나했어요 ㅋㅋ

아무래도 웹이다보니 포인터 개념이 익숙치가 않나봐요..

하여튼 더 고민해봐야 할 문제네요..

같이 고민해줘서 고마워요 형 ㅎㅎㅎㅎ
변종원(웅파) / 2010/07/09 15:38:06 / 추천 0
나도 c의 포인터 때문에 독학하다가 학원을 다녔지만 c의 포인터와 php의 참조는 개념이 틀림.

참조란 무엇인가

PHP에서 참조란 다른 이름으로 같은 변수의 내용에 접근한다는 것을 의미한다. C 포인터와 비슷한 개념은 아닙니다; 심볼 테이블이라고 볼 수 있다. PHP에서 변수명과 변수의 내용은 다르다. 그래서 같은 내용이 다른 이름을 가질 수 있다. 가장 가까운 개념은 유닉스 파일명과 파일입니다 - 변수명은 디렉토리 엔트리이고, 변수 내용은 파일 자체입니다. 참조는 유닉스 파일시스템의 하드 링크와 유사하게 볼 수 있습니다.


jois / 2010/07/10 14:30:24 / 추천 0
 이런 애매한 코드는 작성하지 않는 것이 좋다고 생각합니다.
(딱 봐서 어떤 값일지 예상할 수 없는 코드)