함수의 참조 반환
함수에서 참조 반환(returning references)할 수 있습니다. 참조 반환하기 위해서는 함수 정의에서 함수명 앞에 참조연산자(reference operator) &를 붙입니다.
[code php;gutter:false]
function &bar() {
$a = 5;
return $a;
}
foo(bar()); [/code]
$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]
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
object b
그러나 참조를 반환하기 위해 함수정의를 function &foo(&$obj)와 같이 수정한다면 객체 $b는 객체 $a의 참조(별명)이 되어 $a와 $b 모두 동일한 객체 내용을 나타내게 됩니다. 즉, $a를 가지고 멤버를 다루더라도 $b의 멤버가 수정되게 되지요. 아래는 수정하였을 때의 실행 결과입니다.
object 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]
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 |