생성기(Generator)는 PHP 7에서 처음 등장한 개념이 아닙니다. 이전 버전부터 이미 지원되던 기능입니다. 생성기를 사용하면 Iterator 인터페이스를 구현하는 클래스를 별도로 작성하는 부담 없이도 손쉽게 반복(iteration) 로직을 구현할 수 있습니다.
특히 생성기를 활용하면 배열 전체를 메모리에 올리지 않고도 foreach 문을 작성할 수 있기 때문에, 대용량 데이터를 처리할 때 자주 발생하는 "메모리 한도 초과(Memory Limit Exceeded)" 오류를 예방하는 데 큰 도움이 됩니다.
PHP 7의 생성기 위임이란?
PHP 7에서 새롭게 추가된 생성기 위임(Generator Delegation) 기능은 yield from 키워드를 통해 다른 생성기에 자동으로 위임할 수 있게 해줍니다. 여기에 더해 일반 배열뿐만 아니라 Traversable 인터페이스를 구현한 객체에도 위임이 가능합니다. 덕분에 여러 데이터 소스를 하나의 흐름으로 연결해 순회할 수 있습니다.
생성기 위임 예제 1
<html>
<head>
<title> PHP 7 : Tutorialpoint </title>
</head>
<body>
<?php
function generator(){
yield "zero";
yield "one";
yield "two";
}
function generator1(){
yield "three";
yield "four";
yield "five";
}
function generator2(){
yield "six";
yield "seven";
yield "eight";
yield from generator();
yield "nine";
yield from generator1();
yield "ten";
}
foreach (generator() as $value){
echo $value, PHP_EOL;
}
foreach(generator2() as $value){
echo $value, PHP_EOL;
}
?>
</body>
</html>실행 결과
위 PHP 생성기 위임 프로그램의 실행 결과는 다음과 같습니다.
zero one two six seven eight zero one two nine three four five ten
코드 설명
- 위 코드를 에디터에 작성하고, 예제와 같이 필요한 HTML 구조를 만든 뒤 body 영역에 실제 PHP 7 생성기 코드를 삽입합니다.
- 세 개의 함수가 각각 "generator", "generator1", "generator2"라는 이름으로 선언됩니다.
- "generator" 함수에서는 yield 키워드를 사용해 "zero", "one", "two" 값을 순차적으로 반환하도록 정의했습니다.
- "generator1" 함수에서는 "three", "four", "five"를 yield 하도록 정의했습니다.
- "generator2" 함수에서는 먼저 "six", "seven", "eight"를 yield한 뒤,
yield from을 통해 generator 함수에 위임하고, 이어서 "nine"을 출력한 후 generator1 함수에 다시 위임하고 마지막으로 "ten"을 yield합니다. - 마지막으로 foreach 문을 사용해 "generator"와 "generator2" 함수를 끝까지 순회하며 모든 yield 값을 화면에 출력합니다.