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

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

作成日: 更新日:

基本的な使い方

getCurrentメソッドは、PHPのFiberクラスに属し、現在アクティブなFiberインスタンスを取得するために使用されるメソッドです。PHP 8.1で導入されたFiberは、プログラム内で協調的なマルチタスクを実現するための軽量な実行単位であり、コルーチンとも呼ばれます。これにより、重い処理を途中で一時停止し、別の処理に切り替えてから再び元の処理を再開するといった、効率的な処理の流れを構築できます。

このgetCurrentメソッドは、コードがどのFiberのコンテキスト(実行環境)内で動作しているのかを特定したい場合に非常に役立ちます。例えば、特定のFiberの状態を監視したり、複数のFiber間でのデータ共有や同期処理を実装したりする際に、現在実行中のFiberを正確に把握するために利用されます。

メソッドを呼び出した際、もし現在どのFiberのコンテキスト内でも実行されていない場合、具体的には通常のスクリプト実行や、まだFiberが開始されていない状況では、このメソッドはnullを返します。そのため、getCurrentメソッドの戻り値は、常にFiberインスタンスであるとは限らず、nullが返される可能性を考慮し、適切な条件分岐処理を実装することが重要です。これにより、開発者は現在のコードがFiberによって管理されているかどうかを判別し、状況に応じた柔軟なプログラムを作成できます。

構文(syntax)

1<?php
2
3$currentFiber = Fiber::getCurrent();

引数(parameters)

引数なし

引数はありません

戻り値(return)

?Fiber

このメソッドは、現在実行中の Fiber インスタンス、または Fiber が実行されていない場合は null を返します。

サンプルコード

Fiber::getCurrent() で実行中のFiberを取得する

1<?php
2
3/**
4 * 現在実行中の Fiber インスタンスを取得するサンプルコード
5 */
6
7try {
8    // Fiber を作成
9    $fiber = new Fiber(function (): void {
10        // Fiber 内部で現在の Fiber インスタンスを取得
11        $currentFiber = Fiber::getCurrent();
12
13        // Fiber が実行中であれば Fiber インスタンスが返る
14        if ($currentFiber instanceof Fiber) {
15            echo "Fiber is running.\n";
16            // 中断して値を返す
17            Fiber::suspend("Fiber suspended!");
18        } else {
19            echo "Fiber is not running.\n";
20        }
21    });
22
23    // Fiber を開始
24    $result = $fiber->start();
25    echo "Result from Fiber: " . $result . "\n";
26
27
28    // Fiber の外部で getCurrent を呼び出す
29    $outsideFiber = Fiber::getCurrent();
30
31    // Fiber が実行されていないコンテキストでは null が返る
32    if ($outsideFiber === null) {
33        echo "Fiber is not running outside Fiber context.\n";
34    }
35} catch (Throwable $e) {
36    echo "Exception: " . $e->getMessage() . "\n";
37}

このサンプルコードは、PHP 8 の Fiber クラスにおける getCurrent メソッドの使い方を示しています。Fiber::getCurrent() は、現在実行中の Fiber インスタンスを返します。Fiber の内部で呼び出された場合は、その Fiber インスタンス自身が返されます。一方、Fiber の外部(通常のPHPスクリプト実行コンテキスト)で呼び出された場合は、null が返されます。

サンプルコードでは、まず新しい Fiber インスタンスを作成し、その中で Fiber::getCurrent() を呼び出しています。Fiber が実行中であるため、$currentFiber には Fiber インスタンスが格納され、メッセージが表示されます。その後、Fiber::suspend() によって Fiber の実行を中断し、値を返します。

Fiber の外部では、再度 Fiber::getCurrent() を呼び出しています。ここでは Fiber が実行されていないコンテキストであるため、$outsideFiber には null が格納され、その旨のメッセージが表示されます。

getCurrent メソッドは引数を取りません。戻り値は、Fiber インスタンスまたは null です。Fiber が実行中の場合は Fiber インスタンス、それ以外の場合は null が返されます。このメソッドを使うことで、Fiber 内部で現在の Fiber インスタンスを参照したり、Fiber が実行されているかどうかを判断したりすることができます。エラーハンドリングのため、try-catch ブロックで全体を囲んでいます。

Fiber::getCurrent()は、現在実行中のFiberインスタンスを取得します。Fiberの外部で呼び出した場合、nullが返る点に注意が必要です。Fiber内部でのみ有効な関数であることを覚えておきましょう。

サンプルコードでは、Fiber内部と外部の両方でFiber::getCurrent()を呼び出し、その結果を確認しています。Fiberが実行されていないコンテキストではnullが返ることを確認できます。

また、Fiberの実行中に例外が発生する可能性があるため、try-catchブロックで囲み、例外処理を行うようにしましょう。予期せぬエラーが発生した場合でも、プログラムが停止するのを防ぐことができます。Throwableをキャッチすることで、あらゆる例外に対応できます。

【PHP8.x】getCurrentメソッドの使い方 | いっしー@Webエンジニア