>백엔드 개발 >PHP 튜토리얼 >PHP 생성기 소개 및 예제

PHP 생성기 소개 및 예제

伊谢尔伦
伊谢尔伦원래의
2016-11-23 09:11:561227검색

참고: 생성기는 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(&#39;step必须是正数&#39;);
            }
            for ($i = $start; $i <= $limit; $i += $step) {
                yield $i;
            }
        } else {
            if ($step >= 0) {
                throw new LogicException(&#39;step必须是负数&#39;);
            }
            for ($i = $start; $i >= $limit; $i += $step) {
                yield $i;
            }
        }
    }
    /* 注意range() 和 xrange() 的结果在下面的统一输出中. */
    echo &#39;来自range()的单个奇数: &#39;;
    foreach (range(1, 9, 2) as $number) {
        echo "$number ";
    }
    echo "\n";
    echo &#39;来自xrange()的单个奇数 &#39;;
    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


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.