참고: 생성기는 PHP5.5 이상에서만 지원됩니다.
생성기는 Iterator 인터페이스를 사용하여 클래스를 구현하는 데 따른 성능 오버헤드 및 복잡성 없이 간단한 객체 반복을 구현하는 더 쉬운 방법을 제공합니다.
생성기를 사용하면 foreach 블록에 코드를 작성하여 메모리에 배열을 만들지 않고도 데이터 집합을 반복할 수 있습니다. 이렇게 하면 메모리 제한에 도달하거나 상당한 처리 시간이 소요됩니다. 대신 일반 사용자 정의 함수처럼 생성기 함수를 작성할 수 있으며, 한 번만 반환하는 일반 함수 대신 생성기는 반복해야 하는 값을 생성하기 위해 필요한 만큼 여러 번 생성할 수 있습니다.
간단한 예는 생성기를 사용하여 range() 함수를 다시 구현하는 것입니다. 표준 range() 함수는 각 반환 값에 대해 메모리에 배열을 생성해야 하므로 매우 큰 배열이 생성됩니다. 예를 들어 range(0, 1000000)을 호출하면 메모리 사용량이 100MB를 초과하게 됩니다.
대안으로 Iterator 객체를 생성하고 생성기의 현재 상태를 내부적으로 추적하는 데 충분한 메모리만 필요한 xrange() 생성기를 구현할 수 있으므로 1K 바이트 미만의 메모리가 필요합니다.
예제 #1 range()를 생성기로 구현
<?php function xrange($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new LogicException('step必须是正数'); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException('step必须是负数'); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } } /* 注意range() 和 xrange() 的结果在下面的统一输出中. */ echo '来自range()的单个奇数: '; foreach (range(1, 9, 2) as $number) { echo "$number "; } echo "\n"; echo '来自xrange()的单个奇数 '; foreach (xrange(1, 9, 2) as $number) { echo "$number "; } ?>
위 루틴은 다음을 출력합니다.
Single digit odd numbers from range(): 1 3 5 7 9 Single digit odd numbers from xrange(): 1 3 5 7 9