개요
PHP 함수는 본문(body)의 마지막 문장으로 return을 가질 수 있지만, 반드시 포함해야 하는 것은 아닙니다. 함수가 호출되면 본문 블록의 문장들이 실행된 후, 마지막 문장이 return이든 아니든 프로그램의 제어 흐름은 호출한 환경(calling environment)으로 되돌아갑니다.
return 문이 없는 경우 함수는 NULL 값을 호출자에게 반환합니다. 만약 return 문에 표현식(expression)이 포함되어 있다면, 그 표현식의 평가 결과가 반환됩니다. 함수는 오직 하나의 값만 반환할 수 있으며, 이 값은 스칼라 타입, 배열, 또는 객체일 수 있습니다. 반환된 값은 이후 처리를 위해 변수에 할당할 수도 있습니다.
return 문을 사용하는 함수
다음 예제는 인수로 전달받은 두 정수의 합을 반환하는 함수를 보여줍니다.
예제
<?php
function add($var1, $var2){
$var3 = $var1 + $var2;
return $var3;
}
$x = 10;
$y = 20;
$z = add($x, $y);
echo "addition=$z";
?>실행 결과
addition=30
배열 반환하기
함수는 하나의 값만 반환할 수 있지만, 여러 값을 담은 배열을 반환하는 방법으로 이 제한을 우회할 수 있습니다. 다음 예제는 두 개의 숫자를 함수에 전달하면, 덧셈·뺄셈·곱셈·나눗셈 결과를 담은 배열을 반환합니다.
예제
<?php
function result($var1, $var2){
$r1 = $var1 + $var2;
$r2 = $var1 - $var2;
$r3 = $var1 * $var2;
$r4 = $var1 / $var2;
return array("add"=>$r1, "sub"=>$r2, "multiply"=>$r3, "division"=>$r4);
}
$x = 10;
$y = 20;
$arr = result($x, $y);
foreach ($arr as $k => $v){
echo $k . "->" . $v . "\n";
}
?>실행 결과
add->30 sub->-10 multiply->200 division->0.5
참조(Reference)로 반환하기
인수를 참조로 전달할 수 있는 것처럼, 함수 역시 참조로 값을 반환할 수 있습니다. 이를 위해서는 함수 이름 앞에 &(앰퍼샌드) 기호를 붙여야 하며, 함수를 호출할 때도 & 기호를 함께 사용해야 합니다.
다음 예제에서 myfunction()은 static 배열을 가지고 있습니다. 이 배열의 한 요소가 참조로 반환되어 변수에 저장됩니다. 그런 다음 변수의 값을 수정하고 같은 함수를 다시 호출하면, 함수 내부의 배열 값도 변경된 것을 확인할 수 있습니다.
예제
<?php
function &myfunction(){
static $arr = [1, 2, 3, 4, 5];
echo "array elements: ";
foreach ($arr as $i){
echo "$i ";
}
echo "\n";
return $arr[2];
}
$var = &myfunction();
echo "returned by reference : $var\n";
$var = 100;
$var = &myfunction();
?>실행 결과
array elements: 1 2 3 4 5 returned by reference : 3 array elements: 1 2 100 4 5
위 출력에서 확인할 수 있듯이, 변수 $var를 통해 수정한 값이 함수 내부의 static 배열에도 그대로 반영되었습니다. 이것이 참조로 반환하는 방식의 핵심 동작입니다.
반환 타입 선언(Return Type Declarations)
PHP 7부터는 인수에 타입을 선언할 수 있는 것처럼, 반환되는 값이나 객체에 대해서도 타입 힌트(type hint)를 지정할 수 있습니다. 반환 타입에는 모든 스칼라 타입, 클래스, 배열 등을 사용할 수 있습니다.
문법
//반환값에 타입 힌트를 지정한 함수 정의
function myfunction($arg1, $arg2): type{
..
..
return $var;
}스칼라 타입(int, float, string, bool), array, 클래스/인터페이스, iterable, object 등 표준 PHP 데이터 타입은 모두 함수 선언에서 반환 타입으로 사용할 수 있습니다.
예제
<?php
function add($x, $y): float{
return $x + $y;
}
$var = add(5, 8);
var_dump($var);
?>실행 결과
float(13)
strict_types와 함께 사용하기
declare(strict_types=1) 구문을 사용하면 데이터 타입 간의 자동 형변환(coercion)이 차단됩니다. 즉, 선언된 타입과 일치하지 않는 값을 반환하려고 하면 오류가 발생합니다.
예제
<?php
declare(strict_types=1);
function add($x, $y): int{
return $x + $y;
}
$var = add(5.5, 8.8);
var_dump($var);
?>실행 결과
선언된 반환 타입과 실제 반환값의 타입이 일치하지 않으므로 다음과 같은 치명적 오류(fatal error)가 발생합니다.
PHP Fatal error: Uncaught TypeError: Return value of add() must be of the type integer, float returned