PHP 7 제너레이터 반환 표현식이란?
PHP 5.5에서 제너레이터(Generator)가 처음 도입되었을 때는 yield 키워드로 값을 순차적으로 산출하는 기능만 제공되었고, return 문으로 최종 값을 반환하는 것은 불가능했습니다. 그러나 PHP 7부터 제너레이터 반환 표현식(Generator Return Expressions)이 새롭게 추가되면서, 제너레이터 함수 내부에서도 return 문을 사용해 마지막 표현식의 값을 손쉽게 반환할 수 있게 되었습니다.
- 제너레이터 반환 표현식을 사용하면 표현식의 값만 반환할 수 있으며, 참조(reference)는 반환할 수 없습니다.
- 새롭게 추가된 Generator::getReturn() 메서드를 사용하면, 제너레이터가 정의된 모든 값을 산출(yield)하고 종료된 이후에 그 반환값을 가져올 수 있습니다.
- PHP 7의 제너레이터는 코루틴(co-routine) 방식으로 동작하기 때문에, 제너레이터를 실행하는 클라이언트 코드 쪽에서 최종 반환값을 받아 프로그램 로직에 활용할 수 있습니다.
제너레이터 반환 표현식 예제 1
<html>
<head>
<title> PHP 7 Feature : Generator Return Expressions </title>
</head>
<body>
<?php
$generator = (function(){
yield "five";
yield "six";
yield "seven";
return "eight";
})
();
foreach ($generator as $val){
echo $val, PHP_EOL;
}
echo $generator ->getReturn(), PHP_EOL;
?>
</body>
</html>
실행 결과
위 PHP 프로그램의 출력 결과는 다음과 같습니다.
five six seven eight
코드 설명
- 먼저 에디터에 위 예제와 같이 필요한 HTML 구조를 작성하고, body 부분에 제너레이터 반환 표현식을 처리하는 실제 PHP 7 코드를 삽입합니다.
- 다음으로 $generator 변수에 익명 함수(클로저)를 할당하고 즉시 실행하여 제너레이터 객체를 생성합니다.
- $generator 내부에는 yield "five", yield "six", yield "seven" 세 개의 값을 순차적으로 산출하도록 정의하고, 마지막에 return 문으로 "eight"을 반환합니다.
- 마지막으로 foreach 반복문을 통해 $generator를 끝까지 순회하며 yield된 값들을 하나씩 출력(PHP_EOL로 줄바꿈)한 뒤, getReturn() 메서드를 호출해 제너레이터의 반환값인 "eight"을 추가로 출력합니다.
제너레이터 반환 표현식 예제 2
<html>
<head>
<title> PHP 7 Feature: Generator Return Expressions Example </title>
</head>
<body>
<?php
function gen(){
yield 'A';
yield 'B';
yield 'C';
return 'gen-return';
}
$generator = gen();
var_dump($generator);
foreach ($generator as $letter){
echo $letter;
}
var_dump($generator->getReturn());
?>
</body>
</html>
실행 결과
위 PHP 프로그램의 출력 결과는 다음과 같습니다.
object(Generator)#1 (0) { }
ABC
string(10) "gen-return"
var_dump($generator)를 실행하면 해당 변수가 Generator 객체임을 확인할 수 있습니다. 이후 foreach 반복문에서 yield된 값 A, B, C가 차례대로 출력되고, 마지막으로 var_dump($generator->getReturn())을 통해 길이 10의 문자열 "gen-return"이 반환값으로 출력되는 것을 볼 수 있습니다.
참고: getReturn() 사용 시 주의사항
- getReturn()은 제너레이터가 모든 값을 산출하고 완전히 종료된 이후에만 호출할 수 있습니다. 제너레이터가 아직 진행 중일 때 호출하면 Exception이 발생합니다.
- return 문이 없는 제너레이터에 대해 getReturn()을 호출하면 NULL이 반환됩니다.