【PHP8.x】sendメソッドの使い方

sendメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

sendメソッドは、ジェネレータ関数に外部から値を送信し、その実行を再開するメソッドです。

PHPのジェネレータは、yieldキーワードを使用して、実行を一時停止し、値を生成します。sendメソッドは、この一時停止中のジェネレータ関数へ、指定した値をyield式の戻り値として送り込むために使用されます。これにより、ジェネレータ関数は、yield式を通じて外部からのデータを受け取り、そのデータに基づいて処理を続けることが可能になります。

sendメソッドの引数$valueには、ジェネレータに送信したい任意の値を指定します。ジェネレータ内部では、yield式がこの$valueとして評価され、結果としてその値を受け取ることができます。

このメソッドの戻り値は、値を送信した後にジェネレータが次にyieldした値です。もしジェネレータがそれ以上yieldせず終了した場合、sendメソッドはnullを返します。

ジェネレータがまだyield式に到達していない初期状態やrewind()直後などにsendを呼び出した場合、送信された値は破棄されます。これは、ジェネレータが値を最初に受け取れるのは、少なくとも一度yield式に到達している必要があるためです。そのため、最初のyieldに値を送りたい場合は、next()で一度進めてからsend()を使うか、最初のsend()で値が破棄されることを理解した上で利用します。

構文(syntax)

1<?php
2
3function dataProcessorGenerator() {
4    $receivedData = yield; // ここで外部からデータを受け取る
5    yield 'Processed: ' . $receivedData; // 処理したデータを外部に返す
6}
7
8$generator = dataProcessorGenerator();
9
10// ジェネレータを開始し、最初のyieldまで実行(この時点ではデータは受け取らない)
11$generator->current();
12
13// sendメソッドでジェネレータに値を送信し、ジェネレータからの戻り値を受け取る
14$valueToSendToGenerator = 'Input Value';
15$valueReturnedFromGenerator = $generator->send($valueToSendToGenerator);
16
17?>

引数(parameters)

mixed $value

  • mixed $value: ジェネレーターに送信される値。yield式の結果として取得される。

戻り値(return)

mixed

Generator::send() メソッドは、ジェネレータに値を送信し、その値が処理された後に、ジェネレータが次に yield する値を返します。

サンプルコード

PHP Generator::send() でSendGridメールを動的に作成する

1<?php
2
3use SendGrid\Mail\Mail;
4
5/**
6 * SendGrid を使用してメールを送信するサンプル.
7 * Generator::send() を使用して値をジェネレータに送信し、メール内容を動的に生成する。
8 *
9 * @param string $apiKey SendGrid API キー
10 * @param string $toEmail 送信先メールアドレス
11 * @param string $subject メール件名
12 */
13function sendEmailWithGenerator(string $apiKey, string $toEmail, string $subject): void
14{
15    // メール送信処理を生成するジェネレータ
16    $emailGenerator = function (string $toEmail, string $subject) {
17        $email = new Mail();
18        $email->setFrom("from@example.com", "Example Sender");
19        $email->addTo($toEmail, "Example Recipient");
20        $email->setSubject($subject);
21
22        // ジェネレータに値を送信して本文を生成
23        $body = yield; 
24        $email->addContent("text/plain", $body);
25
26        yield $email; // メールオブジェクトを返す
27    };
28
29
30    $generator = $emailGenerator($toEmail, $subject);
31
32    // ジェネレータを開始
33    $generator->rewind();
34
35    // Generator::send() でメール本文をジェネレータに送信
36    $generator->send("This is the dynamic email body sent using Generator::send().");
37
38    /** @var Mail $email */
39    $email = $generator->current();
40    
41    try {
42        $sendgrid = new SendGrid($apiKey);
43        $response = $sendgrid->send($email);
44        
45        // デバッグ用
46        //echo $response->statusCode() . "\n";
47        //print_r($response->headers());
48        //echo $response->body() . "\n";
49
50    } catch (Exception $e) {
51        echo 'Caught exception: '. $e->getMessage() ."\n";
52    }
53}
54
55// SendGrid APIキー、送信先メールアドレス、メール件名を指定して実行
56// sendEmailWithGenerator("YOUR_SENDGRID_API_KEY", "to@example.com", "Dynamic Email Subject");
57

このサンプルコードは、PHPのジェネレータ機能とSendGridライブラリを組み合わせて、動的にメールを生成・送信する方法を示しています。Generator::send()メソッドは、ジェネレータ関数に値を送信するために使用されます。

まず、sendEmailWithGenerator関数は、SendGrid APIキー、送信先メールアドレス、メール件名を引数として受け取ります。この関数内で、メール送信処理を生成するジェネレータ関数 $emailGenerator が定義されています。$emailGenerator は、yield キーワードを使って一時停止し、Generator::send() で送信された値(この場合はメール本文)を受け取ります。そして、受け取った値をメール本文として設定し、最終的にメールオブジェクトを yield します。

次に、$emailGenerator からジェネレータオブジェクトが生成され、rewind() メソッドでジェネレータが開始されます。Generator::send("This is the dynamic email body...") の部分で、メール本文が $emailGenerator に送信されます。送信された値は $body = yield; で受け取られ、メールオブジェクトに設定されます。

ジェネレータからメールオブジェクトを受け取った後、SendGridライブラリを使用して実際にメールを送信します。Generator::send() は、ジェネレータに値を渡すだけでなく、ジェネレータが次に yield する値(この例ではメールオブジェクト)を返す役割も果たします。エラーが発生した場合は、例外がキャッチされ、エラーメッセージが表示されます。最後に、コメントアウトされている sendEmailWithGenerator("YOUR_SENDGRID_API_KEY", "to@example.com", "Dynamic Email Subject"); の部分を、実際のAPIキーとメールアドレスに置き換えることで、メールを送信できます。

Generator::send()は、ジェネレータ関数内でyieldされた箇所に値を渡すメソッドです。このサンプルでは、メール本文を動的に生成するために使用されています。$generator->rewind()でジェネレータを初期状態に戻す必要があります。yield式がない状態でsend()を呼ぶとエラーになるため注意してください。SendGrid APIキーは必ずご自身のものを設定し、送信先メールアドレスも有効なものを指定してください。また、コメントアウトされているデバッグ用のコードは、必要に応じて有効活用してください。本番環境では、APIキーをソースコードに直接記述せず、環境変数などを用いて安全に管理することを推奨します。

PHP Generator::send() で値を受け取り生成する

1<?php
2
3/**
4 * Generator::send() の使用例:値をジェネレータに送信し、次の値を生成する
5 */
6function numberGenerator(): Generator
7{
8    $i = 0;
9    while (true) {
10        $value = yield $i;
11
12        // send() で値が送信された場合、それを $i に加算する
13        if ($value !== null) {
14            $i += $value;
15        } else {
16            $i++;
17        }
18    }
19}
20
21$generator = numberGenerator();
22
23// 最初の値を生成
24echo "Initial value: " . $generator->current() . PHP_EOL; // Initial value: 0
25$generator->next();
26
27// 値を送信して次の値を生成
28echo "Value after send(5): " . $generator->send(5) . PHP_EOL; // Value after send(5): 6
29$generator->next();
30
31// 値を送信して次の値を生成
32echo "Value after send(10): " . $generator->send(10) . PHP_EOL; // Value after send(10): 17
33$generator->next();
34
35// 値を送信せずに次の値を生成
36echo "Value after next(): " . $generator->current() . PHP_EOL; // Value after next(): 18
37
38$generator->next();
39
40echo "Value after next(): " . $generator->current() . PHP_EOL; // Value after next(): 19

PHP 8 の Generator::send() メソッドは、ジェネレータ関数内で yield 式に値を送信し、ジェネレータの実行を再開して次の値を生成するために使用されます。Generator クラスに属するメソッドで、ジェネレータの内部状態を制御する重要な役割を担います。

引数 $value には、ジェネレータに送信する値を指定します。この値は、ジェネレータ関数内の yield 式の結果として変数に代入されます。

戻り値は、ジェネレータが次に yield した値です。ジェネレータが終了した場合や、return ステートメントに到達した場合は、NULL が返されます。

サンプルコードでは、numberGenerator() 関数がジェネレータとして定義されています。この関数は、while ループ内で yield $i を使用して値を生成し、send() で送信された値を $i に加算します。send() で値が送信されなかった場合は $i をインクリメントします。

$generator->send(5) は、ジェネレータに値 5 を送信し、ジェネレータの実行を再開します。ジェネレータ関数内では、$value5 が代入され、$i に加算されます。その結果、次の yield で生成される値は、加算後の $i の値となります。$generator->next() は、値を送信せずに次の値を生成します。send()next() を組み合わせることで、ジェネレータの動作を柔軟に制御できます。

Generator::send()メソッドは、ジェネレータ関数に値を送り、次の値を生成する際に使用します。yield式の結果として、送られた値を受け取れます。send()を使うとジェネレータの状態を外部から変更できるため、処理の流れを制御するのに役立ちます。

注意点として、send()を最初に呼び出すことはできません。ジェネレータは最初にnext()メソッドなどで起動する必要があります。また、send()で値を送信しない場合は、yield式の戻り値はnullになります。サンプルコードでは、$value !== nullで値が送信されたかどうかをチェックしています。send()に渡す値の型には注意し、ジェネレータ関数内で適切に処理されるようにする必要があります。