Computer >> 컴퓨터 >  >> 프로그램 작성 >> PHP

PHP 생성기 클래스

<시간/>

소개

foreach와 같은 반복 구문을 사용하여 방대한 데이터 컬렉션 탐색 대용량 메모리와 상당한 처리 시간이 필요합니다. 발전기 사용 이러한 오버헤드 없이 데이터 세트를 반복할 수 있습니다. 제너레이터 함수는 일반 함수와 유사합니다. 그러나 함수의 return 문 대신 제너레이터는 yield를 사용합니다. 반복할 값을 제공하기 위해 반복적으로 실행되는 키워드입니다.

yield 키워드는 생성기 메커니즘의 핵심입니다. 사용법은 return과 비슷해 보이지만 함수의 실행을 멈추지 않는다. 반복을 위한 다음 값을 제공하고 함수의 실행을 일시 중지합니다.

구문

Generator implements Iterator {
   /* Methods */
   public current ( void ) : mixed
   public getReturn ( void ) : mixed
   public key ( void ) : mixed
   public next ( void ) : void
   public rewind ( void ) : void
   public send ( mixed $value ) : mixed
   public throw ( Throwable $exception ) : mixed
   public valid ( void ) : bool
   public __wakeup ( void ) : void
}

방법

public Generator::current ( void ) − 혼합 — 산출된 값을 가져옵니다.

public Generator::getReturn ( void ) :혼합 — 생성기의 반환 값 가져오기

공개 Generator::key ( void ) - 혼합 — 산출된 값의 키를 가져옵니다.

공개 생성기::next ( void ) − void — 생성기 실행을 재개합니다. NULL을 인수로 사용하여 Generator::send()를 호출하는 것과 같은 효과입니다.

공개 생성기::되감기( void ) − void — 반복자를 되감습니다. 반복이 이미 시작된 경우 예외가 발생합니다.

public Generator::send ( 혼합 $value ) :혼합 — 현재 yield 표현식의 결과로 주어진 값을 제너레이터로 보내고 제너레이터를 재개합니다.

public Generator::throw ( Throwable $exception ) - 혼합 — 제너레이터에 예외를 던지고 제너레이터의 실행을 재개합니다.

공개 생성기::valid ( void ) − bool — 반복자가 닫혔는지 확인

공개 생성기::__wakeup ( void ) − void — 생성기를 직렬화할 수 없으므로 예외가 발생합니다.

Generator 클래스는 Iterator 인터페이스를 구현합니다. 생성기 개체는 new를 통해 인스턴스화할 수 없습니다. yield 키워드가 있는 모든 사용자 정의 함수는 생성기 클래스의 객체를 생성합니다.

발전기 예

제너레이터는 Iterator 인터페이스를 구현하므로 각 루프를 사용하여 산출된 값을 탐색할 수 있습니다.

<?php
function squaregenerator(){
   for ($i=1; $i<=5; $i++){
      yield $i*$i;
   }
}
$gen=squaregenerator();
foreach ($gen as $val){
   echo $val . " ";
}
?>

출력

위의 프로그램은 다음과 같은 출력을 보여줍니다.

1 4 9 16 25

다음 예제에서는 생성자 클래스의 current() 및 next() 메서드를 사용하여 산출된 값을 순회합니다. 루프 상태는 valid() 메소드로 확인합니다.

예시

<?php
function squaregenerator(){
   for ($i=1; $i<=5; $i++){
      yield $i*$i;
   }
}
$gen=squaregenerator();
while ( $gen->valid() ){
   echo "key: " . $gen->key(). " value: ". $gen->current() . "\n";
   $gen->next();
}
?>

출력

위의 프로그램은 다음과 같은 출력을 보여줍니다.

key: 0 value: 1
key: 1 value: 4
key: 2 value: 9
key: 3 value: 16
key: 4 value: 25