Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 7 생성기 위임(Generator Delegation): yield from으로 메모리 효율적인 반복 처리하기

생성기(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 값을 화면에 출력합니다.