>  기사  >  백엔드 개발  >  PHP 반복자 생성기 소개

PHP 반복자 생성기 소개

不言
不言원래의
2018-07-05 15:08:271691검색

이 기사에서는 특정 참조 가치가 있는 PHP 반복자 생성기를 주로 소개합니다. 이제 모든 사람과 공유합니다. 필요한 친구가 참조할 수 있습니다.

Iteration 및 반복자

Iteration은 프로세스의 반복 실행을 의미합니다. 실행을 반복이라고 합니다. 예를 들어 일반적인 순회는 반복입니다.

$arr = [1, 2, 3, 4, 5];foreach($arr as $key => $value) {    echo $key . ' => ' . $value . "\n";}

foreach가 배열을 순회하고 해당 내용을 반복적으로 출력하는 것을 볼 수 있습니다. foreach 내에서 각 반복은 현재 요소의 값을 $value에 할당하고 배열 포인터를 다음 요소로 이동하여 다음 반복을 준비하므로 순차적 순회를 구현합니다. . 외부 함수가 자체 내부 데이터를 반복할 수 있도록 하는 인터페이스는 Iterator 인터페이스이고, 해당 반복 자체는 Iterator 객체입니다. foreach对数组遍历并迭代输出其内容。在foreach内部,每次迭代都会将当前的元素的值赋给$value并将数组的指针移动指向下一个元素为下一次迭代做准备,从而实现顺序遍历。像这样能够让外部的函数迭代自己内部数据的接口就是迭代器接口,对应的那个被迭代的自己就是迭代器对象

PHP提供了统一的迭代器接口:

Iterator extends Traversable {    // 返回当前的元素
    abstract public mixed current(void)
    // 返回当前元素的键
    abstract public scalar key(void)
    // 向下移动到下一个元素
    abstract public void next(void)
    // 返回到迭代器的第一个元素
    abstract public void rewind(void)
    // 检查当前位置是否有效
    abstract public boolean valid(void)}

通过实现Iterator接口,我们可以自行的决定如何遍历对象。

foreach之所以能工作,是因为这些集合类都实现了Iterable接口,该接口中定义了Iterator迭代器的产生方法,并且foreach就是通过Iterable接口在序列中进行移动。

yield和生成器

相比较迭代器,生成器提供了一种更容易的方法来实现简单的对象迭代,性能开销和复杂性都大大降低。

一个生成器函数看起来像一个普通的函数,不同的是普通函数返回一个值,而生成器可以yield生成许多个值,并且每一次的yield只是暂停当前的执行状态,当下次调用生成器函数时,PHP会从上次暂停的状态继续执行下去。

我们在使用生成器的时候可以像关联数组那样指定一个键名对应生成的值。如下生成一个键值对与定义一个关联数组相似。

function xrange($start, $limit, $step = 1) {    
for ($i = $start, $j = 0; $i <= $limit; $i += $step, $j++) {        // 给予键值
        yield $j => $i;
    }
}$xrange = xrange(1, 10, 2);foreach ($xrange as $key => $value) {    
echo $key . &#39; => &#39; . $value . "\n";}

概念理解

首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值。实际上生成器函数返回的是一个Generator对象,这个对象不能通过new实例化,并且实现了IteratorPHP는 통합된 반복자 인터페이스를 제공합니다.

<?php
header("content-type:text/html;charset=utf-8");
function readTxt()
{
    # code...
    $handle = fopen("./test.txt", &#39;rb&#39;);

    while (feof($handle)===false) {
        # code...
        yield fgets($handle);
    }

    fclose($handle);
}

foreach (readTxt() as $key => $value) {
    # code...
    echo $value.&#39;<br />&#39;;
}

반복자 인터페이스를 구현하면 객체를 탐색하는 방법을 스스로 결정할 수 있습니다. Foreach는 이러한 컬렉션 클래스가 모두 Iterator의 생성 방법을 정의하는 Iterable 인터페이스를 구현하고 foreach가 Iterable 인터페이스를 통해 순서대로 이동하기 때문에 작동합니다. yield 및 생성기반복기와 비교하여 생성기는 성능 오버헤드와 복잡성을 크게 줄이면서 간단한 객체 반복을 구현하는 더 쉬운 방법을 제공합니다. 생성기 함수는 일반 함수처럼 보이지만, 일반 함수는 값을 반환하는 반면, 생성기는 많은 값을 생성할 수 있으며, 각 생성은 현재 실행 상태를 일시 중지한다는 점입니다. 다음에 생성기 함수가 호출되면 PHP는 마지막으로 일시 중지된 상태에서 계속 실행됩니다. 생성기를 사용할 때 연관 배열처럼 생성된 값에 해당하는 키 이름을 지정할 수 있습니다. 다음과 같이 키-값 쌍을 생성하는 것은 연관 배열을 정의하는 것과 유사합니다. rrreee

개념적 이해

먼저 개념을 명확히 합시다: 생성기의 Yield 키워드는 반환 값이 아니며 전문 용어로 출력 값이라고 하며 단지 값을 생성합니다. 실제로 생성기 함수는 new를 통해 인스턴스화할 수 없고 Iterator 인터페이스를 구현하는 Generator 객체를 반환합니다. 그럼

foreach 코드에서 반복되는 것은 무엇인가요? PHP가 생성기를 사용하면 Generator 클래스의 객체가 반환됩니다. foreach는 이 객체를 반복할 수 있습니다. 각 반복마다 PHP는 Generator 인스턴스를 통해 다음에 반복해야 하는 값을 계산합니다. 이런 방식으로 foreach

는 다음에 반복해야 할 값을 알게 됩니다. 게다가 for

    루프가 실행되면 즉시 중지됩니다. 다음에 루프할 때
  • foreach

  • for

  • 에 다음 값을 다시 요청할 때까지 기다립니다. 그러면 루프가 다시 실행되고 즉시 다시 중지됩니다. 조건이 충족되지 않을 때까지 실행되지 않습니다.
  • 생성기의 장점

생성기는 PHP 애플리케이션의 성능에 매우 큰 영향을 미칩니다.

PHP 코드가 실행될 때 많은 메모리를 절약합니다

입니다. 대용량 데이터 계산에 더 적합

실제 개발 응용 프로그램: 매우 큰 파일 읽기
PHP 개발에서는 csv 파일, 텍스트 파일 또는 일부 로그 파일과 같은 대용량 파일을 읽어야 하는 경우가 많습니다. 5G와 같이 파일이 큰 경우. 이때 모든 내용을 한꺼번에 메모리에 직접 읽어들이는 것은 실용적이지 않습니다. 생성기를 사용하여 파일을 읽으세요. 첫 번째 줄은 처음으로 읽고, 두 번째 줄은 두 번째로 읽는 식입니다.

매번 메모리에 로드되는 텍스트는 한 줄뿐입니다🎜. 메모리 사용량이 크게 감소합니다. 🎜rrreee🎜위 내용은 모두의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요! 🎜🎜관련 권장 사항: 🎜🎜🎜PHP는 Azure Storage Blob을 사용하여 파일을 업로드합니다🎜🎜🎜🎜🎜php 인터페이스 내에서 다른 인터페이스를 요청하는 컬 소개🎜🎜🎜

위 내용은 PHP 반복자 생성기 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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