생성기 함수는 단일 값을 반환하는 대신 요청 시 여러 값을 생성한다는 점을 제외하면 일반 함수와 동일합니다.
생성기 함수가 호출되면 다음을 반환합니다. 반복 가능한 객체입니다. 해당 객체를 반복하면(예: foreach 루프를 통해) PHP는 값이 필요할 때마다 생성기 함수를 호출한 다음 생성기가 값을 생성할 때 생성된 값을 저장합니다. 다음 값이 필요할 때 복원됩니다.
더 이상 값이 생성되지 않으면 생성기 함수는 간단히 종료될 수 있으며 호출 코드는 배열이 해당 값을 모두 사용한 것처럼 계속됩니다.
참고:
생성기는 값을 반환할 수 없습니다. 그렇게 하면 컴파일 오류가 발생합니다. 생성기의 빈 반환 문은 유효한 구문이며 생성기가 중단됩니다.
산출 키워드
생성기 함수의 핵심은 Yield 키워드입니다. 가장 간단한 형태의 Yield 문은 생성기를 보기 위한 값을 제공한다는 점을 제외하고는 return 문과 매우 유사합니다. , 값을 반환한 다음 실행을 중지하는 대신.
예제 #1 값 생성의 간단한 예
<?php function gen_one_to_three() { for ($i = 1; $i <= 3; $i++) { // Note that $i is preserved between yields. yield $i; } } $generator = gen_one_to_three(); foreach ($generator as $value) { echo "$value\n"; } ?>
위 루틴은 다음을 출력합니다.
1 2 3
참고:
내부적으로 직렬화된 정수 키는 비연관 배열처럼 출력 값과 쌍을 이룹니다.
주의 사항 항복을 사용할 때(예: 등호 오른쪽에 대입문) 괄호를 사용해야 합니다. 예를 들어 다음 코드는 정확합니다.
$data = (yield $value);
그러나 다음 코드는 구문 분석 오류를 발생시킵니다.
$data = Yield $value;
이 구문은 생성기 개체의 send() 메서드와 함께 사용할 수 있습니다.
사용 값을 얻는 키
PHP는 연관 배열과 생성기를 지원하며, 위와 같이 간단한 값을 생성하는 것 외에도 동시에 키를 생성할 수도 있습니다.
키 생성 /값 쌍의 구문은 매우 간단하며 아래와 같이 연관 배열을 정의하는 데 사용할 수 있습니다.
예제 #2 키/값 쌍 생성
<?php /* The input is semi-colon separated fields, with the first * field being an ID to use as a key. */ $input = <<<'EOF' 1;PHP;Likes dollar signs 2;Python;Likes whitespace 3;Ruby;Likes blocks EOF; function input_parser($input) { foreach (explode("\n", $input) as $line) { $fields = explode(';', $line); $id = array_shift($fields); yield $id => $fields; } } foreach (input_parser($input) as $id => $fields) { echo "$id:\n"; echo " $fields[0]\n"; echo " $fields[1]\n"; } ?>
위 루틴은 다음을 출력합니다. :
1: PHP Likes dollar signs 2: Python Likes whitespace 3: Ruby Likes blocks
주의 사항은 이전 세대의 단순 값과 동일합니다. 컨텍스트 표현식에서 키/값 쌍을 생성하려면 항복 문을 괄호로 묶어야 합니다.
$data = (yield $key => $value);
Null 값 생성
매개 변수 없이 Yield를 호출하여 자동 생성된 키를 사용하여 NULL 값을 생성할 수 있습니다.
예제 #3 NULL 생성
<?php function gen_three_nulls() { foreach (range(1, 3) as $i) { yield; } } var_dump(iterator_to_array(gen_three_nulls())); ?>
위 루틴은 출력:
array(3) { [0]=>NULL [1]=>NULL [2]=>NULL }
참조로 값 생성
생성기 함수는 참조로 값을 생성할 수 있습니다. 이는 함수에서 참조를 반환하는 것과 동일합니다. 함수 이름.
예제 #4 참조로 값 산출
<?php function &gen_reference() { $value = 3; while ($value > 0) { yield $value; } } /* 注意我们可以在循环中改变$number * because the generator is yielding references, $value * within gen_reference() changes. */ foreach (gen_reference() as &$number) { echo (--$number).'... '; } ?>
위 루틴은 다음을 출력합니다.
2... 1... 0...