> 백엔드 개발 > PHP 튜토리얼 > PHP의 Iterator 및 Generator를 설명하는 예

PHP의 Iterator 및 Generator를 설명하는 예

藏色散人
풀어 주다: 2023-04-10 11:58:02
앞으로
2424명이 탐색했습니다.

생성기를 설명하기 전에 먼저 반복자를 소개하겠습니다.

PHP에서는 일반적으로 foreach를 사용하여 배열을 탐색합니다.

객체를 횡단 가능하게 만들고 싶다면 어떻게 해야 할까요?

PHP는 Iterator 인터페이스를 제공합니다. 이 인터페이스가 구현되는 한 이 객체는 foreach를 통해 반복될 수 있습니다.

예제는 다음과 같습니다.

class myIterator implements Iterator {
    private $index = 0;
    private $data = '';

    public function __construct($data) {
        $this->index = 0;
        $this->data = $data;
    }

    function rewind() {
        $this->index = 0;
    }

    function current() {
        return $this->data[$this->index];
    }

    function key() {
        return $this->index;
    }

    function next() {
        ++$this->index;
    }

    function valid() {
        return isset($this->data[$this->index]);
    }
}

$it = new myIterator(array(
    "hello",
    "php",
    "iterator",
));
foreach($it as $key => $value) {
    echo "$key : $value<br>";
}
로그인 후 복사

foreach를 통해 $it를 탐색하면 PHP가 순서대로 자신을 호출합니다.

rewind() 첫 번째 요소로 재설정
valid() 현재 위치가 유효한지 확인합니다.
current() 현재 요소를 반환합니다.
key()   현재 요소의 키를 반환합니다.
next() 다음 요소를 가리킵니다.

제너레이터는 PHP 5.5에 도입된 새로운 기능이지만 현장에서 사용하는 사람은 거의 없는 것 같습니다. 현재의.

다음은 공식 PHP 문서에 있는 생성기에 대한 설명입니다.

생성기는 간단한 객체 반복을 구현하는 더 쉬운 방법을 제공합니다. Iterator 인터페이스를 구현하기 위해 클래스를 정의하는 방법에 비해 성능 오버헤드와 복잡성은 다음과 같습니다. 크게 감소했습니다.

생성기를 사용하면 foreach 블록에 코드를 작성하여 메모리에 배열을 만들지 않고도 데이터 집합을 반복할 수 있습니다. 이렇게 하면 메모리 제한에 도달하거나 상당한 처리 시간이 소요됩니다.

대신, 한 번만 반환하는 일반 함수와 달리 생성기 함수는 반복해야 하는 값을 생성하는 데 필요한 만큼 생성할 수 있습니다.

생성기의 장점을 반영하기 위해 비교용 함수를 정의해 보겠습니다.

function func1()
{
    foreach (range(0, 1000000) as $value){
        echo $value;
    }
}

func1();
// ( ! ) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 402653192 bytes) in xxx.php on line 5
로그인 후 복사

이렇게 큰 배열이 생성되어 메모리에 반복되기 때문에 PHP는 단일 프로세스의 메모리 제한을 초과했다는 메시지를 직접 표시합니다.

이제 생성기를 사용하여 처리해 보겠습니다.

function func1()
{
    foreach (range(0, 1000000) as $value){
        yield $value;
    }
}

var_dump(func1()); // object(Generator)[1]
foreach (func1() as $value){
    echo $value;
}
로그인 후 복사

func1()을 호출하고 Generator 객체를 반환한 것을 볼 수 있습니다. 이 객체는 foreach를 사용하여 반복할 수 있습니다. PHP는 Generator 인스턴스에 계산을 요청합니다. 반복할 다음 A 값을 제공합니다.

생성기의 장점은 값을 생성할 때마다 생성기의 내부 상태가 일시 중지된다는 것입니다.

생성기에서 다음 값이 요청되면 내부 상태가 복원됩니다. 생성기의 내부 상태는 함수 정의 본문의 끝에 도달하거나 빈 return 문을 만날 때까지 일시 중지와 재개 사이를 계속 전환합니다.

【추천 학습: PHP 비디오 튜토리얼

위 내용은 PHP의 Iterator 및 Generator를 설명하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿