phpclass/객체정보2001. 3. 2. 14:32
함수의 참조 반환
함수에서 참조 반환(returning references)할 수 있습니다. 참조 반환하기 위해서는 함수 정의에서 함수명 앞에 참조연산자(reference operator) &를 붙입니다.
[code php;gutter:false] function &bar() {
$a = 5;
return $a;
}
foo(bar()); [/code]
함수에서 참조가 아닌 값으로 반환하게 되면 호출측에서 받게 되는 것은 함수 내의 반환값의 복사본을 받게 될 것입니다.
[code php;gutter:false] <?php

class test {
var $mb;

function test($mb="default") {
$this->mb = $mb;
}
}

function foo(&$obj) {
$obj->mb = "in foo()";
return $obj;
}

$a = &new test;
$b = &foo($a);
$b->mb = "object b";
echo $a->mb."\n";
echo $b->mb."\n";

?> [/code]
위와 같이 참조가 아닌 값으로 반환하게 되면 객체 $a와 객체 $b는 완전히 별개의 객체입니다. 따라서 실행결과를 보면 아래와 같이 객체의 멤버변수 $mb의 값은 틀립니다.
in foo()
object b
그러나 참조를 반환하기 위해 함수정의를 function &foo(&$obj)와 같이 수정한다면 객체 $b는 객체 $a의 참조(별명)이 되어 $a와 $b 모두 동일한 객체 내용을 나타내게 됩니다. 즉, $a를 가지고 멤버를 다루더라도 $b의 멤버가 수정되게 되지요. 아래는 수정하였을 때의 실행 결과입니다.
object b
object b
위에서 한가지 더 주의할 것이 있습니다. $b = &foo($a) 에서 대입연산자로 $b를 할당할 때 반드시 참조로 할당하여야 한다는 것입니다. 아무리 함수가 참조를 반환하더라도 $b = foo($a) 와 같이 하게 되면 $b는 $a의 객체가 참조되는 것이 아니라 대입되는 과정에 복사되는 것입니다. 따라서 함수로부터 참조를 반환할 때는 함수 정의 부분과 호출측의 대입 부분 모두 참조연산자 &를 붙여야 합니다.
[code php;gutter:false] function &returns_reference() {
return $someref;
}

$newref =&returns_reference(); [/code]

'phpclass > 객체정보' 카테고리의 다른 글

What Is an Interface?  (0) 2005.10.25
{참조}5.참조 삭제  (0) 2001.03.02
{참조}3.참조에 의한 전달  (0) 2001.03.02
{참조}2.객체생성에서의 참조  (0) 2001.03.02
{참조}1.참조변수의 생성  (0) 2001.03.02
Posted by 방글24