PHP 참조 반환(Return by Reference)이란?
PHP에서는 함수가 값을 복사해 반환하는 대신 참조(reference) 자체를 반환하도록 정의할 수 있습니다. 이는 반환된 참조가 어떤 변수에 바인딩될지 지정해야 하는 상황에서 유용하게 사용됩니다.
참조를 반환하는 함수를 정의하는 방법은 간단합니다. 함수 이름 앞에 앰퍼샌드(&) 기호를 붙이면 됩니다. 단, 호출하는 쪽에서도 결과를 받을 때 &를 붙여 참조 할당을 해야 한다는 점에 유의하세요.
함수에서 참조 반환하기 – 기본 예제
아래 예제에서 myfunction()은 참조를 반환하도록 정의되었습니다. 함수 내부에는 정적(static) 변수 $x가 선언되어 있으며, 이 변수의 참조가 반환되어 전역 변수 $a에 할당됩니다. 함수 외부에서 $a에 다른 값을 할당하면 함수 내부의 정적 변수 값도 함께 변경됩니다. 두 변수가 동일한 메모리 공간을 공유하기 때문입니다.
<?php
function &myfunction(){
static $x=10;
echo "x Inside function: ",$x,"\n";
return $x;
}
$a=&myfunction(); // 함수 내부의 $x에 대한 참조를 포함
echo "returned by reference: ", $a, "\n";
$a=$a+10; // 함수 내부 변수도 함께 증가
$a=&myfunction();
?>실행 결과
위 예제를 실행하면 다음과 같은 출력을 얻습니다.
x Inside function: 10 returned by reference: 10 x Inside function: 20
$a에 10을 더했을 뿐인데, 함수 내부의 정적 변수 $x도 20으로 증가한 것을 확인할 수 있습니다. 이것이 참조 반환의 핵심 동작 방식입니다.
클래스 메서드에서 참조 반환하기
클래스의 메서드 역시 참조를 반환할 수 있습니다. 이를 활용하면 private으로 선언된 인스턴스 변수의 값을 클래스 외부에서 변경할 수 있습니다. 원래라면 외부에서 접근할 수 없는 private 프로퍼티지만, 참조 반환을 통해 우회적으로 접근이 가능해집니다.
<?php
class myclass{
private $val;
function __construct($x){
$this->val=$x;
}
function &getbyref(){
return $this->val;
}
function getbyval(){
return $this->val;
}
}
$a=new myclass(10);
$b=&$a->getbyref();
$b=100;
echo "Value of private property: ", $a->getbyval();
?>실행 결과
위 스크립트의 실행 결과는 다음과 같습니다.
Value of private property: 100
getbyref() 메서드로 얻은 참조 $b에 100을 할당했을 뿐인데, private 프로퍼티 $val의 값이 100으로 변경된 것을 확인할 수 있습니다.
참조 반환 사용 시 주의사항
참조 반환은 강력한 기능이지만 남용하면 코드의 가독성과 유지보수성이 떨어질 수 있습니다. PHP 공식 매뉴얼에서도 성능상 큰 이점이 없으므로 꼭 필요한 경우가 아니라면 일반적인 값 반환을 사용할 것을 권장합니다. 대량의 데이터 구조를 다루거나 특정 변수 바인딩이 필요한 특수한 상황에서만 신중하게 사용하는 것이 좋습니다.