PHP에서 생성기에 대한 간단한 이해(코드 분석)
이 글은 PHP(코드 분석)에 대한 간단한 이해를 제공합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
Generator 클래스
# http://php.net/manual/zh/class.generator.php Generator implements Iterator { /* Methods */ //获取迭代器当前值 public mixed current ( void ) //获取迭代器当前值 public mixed getReturn ( void ) //返回当前产生的键 public mixed key ( void ) //生成器从上一次yield处继续执行 public void next ( void ) //重置迭代器 public void rewind ( void ) //向生成器中传入一个值 public mixed send ( mixed $value ) //向生成器中抛入一个异常 public mixed throw ( Throwable $exception ) //检查迭代器是否被关闭 public bool valid ( void ) //迭代器序列化时执行的方法 public void __wakeup ( void ) }
Generator 생성
클래스 인스턴스화를 시도해보세요
$gen = new Generator(); # 我们发现不能直接手动实例化 # output PHP Fatal error: Uncaught Error: The "Generator" class is reserved for internal use and cannot be manually instantiated in /web/www/sxx_admin3/src/cache/test/amphp/gen3.php:8
함수 메서드 사용해보기
function gen($max) { for ($i=0; $i<$max; $i++) { yield $i; } } $gen = gen(5); # success # 成功,我们只需要在普通函数方法里yield即可成了生成器
PHP의 Generator 이해하기
사실 Python, Go 등 모든 언어에는 Generator가 있습니다
Generator Iteration foreach
코드는 유효한 getReturn
function gen($max) { for ($i=0; $i<$max; $i++) { yield $i; } return $max; } $gen = gen(5); foreach ($gen as $val) { var_dump($val); } //如果已经迭代完成,获取返回值 // php7 支持 // valid 判断当前迭代器是否迭代完成 // getReturn 返回迭代器的返回值 if (version_compare(PHP_VERSION, '7.0.0') >= 0 && !$gen->valid()) { var_dump($gen->getReturn()); }
key 값 foreach를 사용하는 생성기 반복
을 보여줍니다. 반복자 반환 값은
function gen($max) { for ($i=0; $i<$max; $i++) { yield $i => $i+1; } return $max; } $gen = gen(5); //var_dump($gen->key()); //var_dump($gen->current()); foreach ($gen as $key=>$val) { var_dump($key . "=>" . $val); } # output string(4) "0=>1" string(4) "1=>2" string(4) "2=>3" string(4) "3=>4" string(4) "4=>5"
generator iteration manual iteration
과 유사하게 키와 값을 가질 수 있습니다. 이 코드는 되감기를 보여줍니다. next, send 메소드
function gen($max) { for ($i=0; $i<$max; $i++) { // 此处的(yield $i)在php7以后版本可省略 $res = (yield $i); var_dump($res); } return $max; } $gen = gen(10); // 可不调用,隐式调用 // 如果迭代开始后不能再rewind(即使用了next或send后) $gen->rewind(); // 打印获取到当前生成器的值 var_dump("1::" . $gen->current()); //output: string(4) "1::0" // 下面2句代码执行,将返回错误 // $gen->next(); // $gen->rewind(); //继续执行,知道遇到下一个yield $gen->next(); var_dump("2::" . $gen->current()); //output: string(4) "2::1" $gen->next(); var_dump("3::" . $gen->current()); //output: string(4) "3::2" // send传null值等同于调用next(本方法尝试来自python的迭代器,成功) $gen->send(null); var_dump("4::" . $gen->current()); //output: string(4) "4::3" // send传值会也会继续执行 $gen->send(100); var_dump("5::" . $gen->current()); //output: string(4) "5::4" //如果已经迭代完成,获取返回值 // php7 支持 if (version_compare(PHP_VERSION, '7.0.0') >= 0 && !$gen->valid()) { var_dump($gen->getReturn()); } # output: string(4) "1::0" NULL string(4) "2::1" NULL string(4) "3::2" NULL string(4) "4::3" int(100) string(4) "5::4" # 我们先不去理会gen里var_dump输出的NULL或int(100) # 我们先去理解每次next后current可以获取到当前yield的值即可
send 출력을 이해해 보세요
function gen($max) { for ($i=0; $i<$max; $i++) { $res = (yield $i); var_dump($res); } return $max; } $gen = gen(10); var_dump("1::" . $gen->current()); $gen->send(222); var_dump("2::" . $gen->current()); $gen->send(333); var_dump("3::" . $gen->current()); $gen->send(null); var_dump("4::" . $gen->current()); # output: string(4) "1::0" int(222) string(4) "2::1" int(333) string(4) "3::2" int(444) string(4) "4::3" # send和next # next() => current = yield值 # send(val) $rs = yield 表达式执行 = val; //send这样理解即可 # 在当前某个yield处时send,当前yield表达式处返回,如果没有变量接收,那么继续下一个yield处返回 $rs = (yield somethind_to_do(...) ); ^ |-------------------| | yield值 | |----------------------------| | yield 表达式 yield表达式结果 # 执行顺序流程类似 $res = (yield 1); // <- var_dump("1::" . $gen->current()); 第一步到yield返回 var_dump($res); // <- $gen->send(222); 第二步send:222后,继续往下走$res=222 然后var_dump($res), 然后到了yield 2 $res = (yield 2); // <- var_dump("2::" . $gen->current()); 打印当前的值2 var_dump($res); // <- $gen->send(333); 第三步send:333后,继续往下走$res=333 然后var_dump($res), 然后到了yield 3 $res = (yield 3); // <- var_dump("3::" . $gen->current()); var_dump($res); // <- $gen->send(null); 第二步send:null后,继续往下走$res=null 然后var_dump($res), 然后到了yield 4 $res = (yield 4); // <- var_dump("4::" . $gen->current());
요약
처음으로 next만 이해하고 먼저 보내면 됩니다
next->를 사용하면 반복자를 적극적이고 자동으로 실행할 수 있습니다
send- > 우리의 반복자는 양방향 통신을 구현하고 실행 프로세스의 순서를 변경합니다
사용 시나리오와 Co 자동 실행 본체를 나중에 소개하겠습니다
위 내용은 PHP에서 생성기에 대한 간단한 이해(코드 분석)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
