目次
コンセプト
yield
比較
キー/値ペア
練習
send()
ホームページ バックエンド開発 PHPチュートリアル 最新の PHP: ジェネレーターと例

最新の PHP: ジェネレーターと例

Jun 20, 2016 pm 12:25 PM

コンセプト

簡単に言うと、PHP のジェネレーターは特殊なイテレーター (Iterator) ですが、通常、計算されたもの全体を反復する標準の PHP イテレーターとは異なります。データはメモリ内に設定され、ジェネレータは貴重なシステム メモリを占有することなく、次の値を動的に計算して引き渡すことができます。ジェネレーターは順方向のみの反復子であり、反復の開始後に巻き戻すことはできないため、同じジェネレーターを複数回反復することはできません。

yield

ジェネレーターを使用するには、yield キーワードを使用する必要があります。 yield は return と似ていますが、関数の実行を終了する代わりにループに値を提供し、ジェネレーター関数の実行を一時停止する点が異なります。

<?phpfunction myGenerator() {    yield 'value1';    yield 'value2';    yield 'value3';} foreach (myGenerator() as $yieldedValue) {      echo $yieldedValue, PHP_EOL;  }  
ログイン後にコピー

ジェネレーターが呼び出されると、このオブジェクトを反復処理できるオブジェクトが返されます (foreach ループなどを介して)。PHP はジェネレーター関数を実行します。値が必要になるたびに呼び出され、値を生成した後にジェネレーターの状態が保存されるため、次の値を生成する必要があるときに呼び出し状態を復元できます。値を生成する必要がなくなったら、ジェネレーター関数は単に終了することができ、ジェネレーターを呼び出したコードは、配列が反復処理されたかのように実行を続けることができます。

比較

乱数を生成する別の従来の例を見てください:

<?phpfunction makeRange($length) {    $dataset = [];    for ($i = 0; $i < $length; $i++) {        $dataset[] = $i;    }     return $dataset;} $customRange = makeRange(1000000);foreach ($customRangeas $i) {    echo $i, PHP_EOL;}
ログイン後にコピー

上の例では、makeRange 関数は数百万の整数のメモリ領域。 PHP ジェネレーターは上記の関数を実行することもでき、いつでも整数メモリを割り当てるだけで済みます。例を見てください。

<?phpfunction makeRange($length) {    for ($i = 0; $i < $length; $i++) {        yield $i;    }} foreach (makeRange(1000000) as $i) {    echo $i, PHP_EOL;}
ログイン後にコピー

キー/値ペア

yield は、配列と同様にキーと値のペアを生成することもできます。

<?php$input = <<<'EOF'1;PHP;Likesdollarsigns2;Python;Likeswhitespace3;Ruby;LikesblocksEOF; 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";}
ログイン後にコピー

式のコンテキスト (代入式の右側など) で yield を使用する場合は、括弧を使用する必要があります。発言。

$data = (yield $value);
ログイン後にコピー

yield を引数なしで呼び出して NULL 値を生成し、自動キー名とペアにすることもできます。

ジェネレーターは値を返すことができず、値を返すとコンパイル エラーが発生することに注意してください。ただし、return null は有効な構文であり、ジェネレータの実行を終了します。

練習

実際には、ジェネレーターを使用してファイルを読み取って処理することもできますが、その間にビジネス ロジックを記述することもできますが、これは非常に面倒になります。ファイルを読み取るロジックが複数ある場合は、同様のメソッドを複数記述する必要があるため、ジェネレーターを使用すると、機能とサービスを分離できるだけでなく、メモリ使用量も削減できます。

    function read_file_line($file){        $handle=@fopen($file,'r');        if(!$handle){            throw new Exception("Can not read file!");        }         while(($line=fgets($handle))!==false){            yield $line;        }         if (!feof($handle)) {            throw new Exception('Error: unexpected fgets() fail');        }        fclose($handle);        return ;    }         foreach (read_file_line($file) as $row) {            //print_r($row);        }
ログイン後にコピー

CSV の読み取り方法を見てみましょう:

<?phpfunction getRows($file) {    $handle = fopen($file, 'rb');    if ($handle === false) {        throw new Exception();    }    while (feof($handle) === false) {        yieldfgetcsv($handle);    }    fclose($handle);} foreach (getRows('data.csv') as $row) {    print_r($row);}
ログイン後にコピー

send()

最後に、いくつかの追加 小さなジェネレーターは、send() 関数を通じて値を注入し、yield を通じて値を受け取ることができます。その後、他のジェネレータ関数の値と同様に使用できます。

function printer() {    while (true) {         // 通过 yield 语句返回注入的值        $string = yield;        echo $string;    }} $printer = printer();$printer->send('Hello world!'); // 输出 Hello world!
ログイン後にコピー

参考:

www.powerxing.com/php-review-generator/

www.cnblogs.com/ CraryPrimitiveMan/p/5130056.html

《モダン php》

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles