함수의 참조 반환
함수에서 참조 반환(returning references)할 수 있습니다. 참조 반환하기 위해서는 함수 정의에서 함수명 앞에 참조연산자(reference operator) &를 붙입니다.
1 2 3 4 5 6 |
function &bar() { $a = 5; return $a; } foo(bar()); |
함수에서 참조가 아닌 값으로 반환하게 되면 호출측에서 받게 되는 것은 함수 내의 반환값의 복사본을 받게 될 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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"; |
위와 같이 참조가 아닌 값으로 반환하게 되면 객체 $a와 객체 $b는 완전히 별개의 객체입니다. 따라서 실행결과를 보면 아래와 같이 객체의 멤버변수 $mb의 값은 틀립니다.
1 2 |
in foo() object b |
그러나 참조를 반환하기 위해 함수정의를 function &foo(&$obj)와 같이 수정한다면 객체 $b는 객체 $a의 참조(별명)이 되어 $a와 $b 모두 동일한 객체 내용을 나타내게 됩니다. 즉, $a를 가지고 멤버를 다루더라도 $b의 멤버가 수정되게 되지요. 아래는 수정하였을 때의 실행 결과입니다.
1 2 |
object b object b |
위에서 한가지 더 주의할 것이 있습니다. $b = &foo($a) 에서 대입연산자로 $b를 할당할 때 반드시 참조로 할당하여야 한다는 것입니다. 아무리 함수가 참조를 반환하더라도 $b = foo($a) 와 같이 하게 되면 $b는 $a의 객체가 참조되는 것이 아니라 대입되는 과정에 복사되는 것입니다. 따라서 함수로부터 참조를 반환할 때는 함수 정의 부분과 호출측의 대입 부분 모두 참조연산자 &를 붙여야 합니다.
1 2 3 4 5 |
function &returns_reference() { return $someref; } $newref =&returns_reference(); |