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

作成日: 更新日:

currentメソッドは、InternalIteratorオブジェクトが指し示す現在の要素を返却するメソッドです。InternalIteratorは、PHPの内部イテレータを扱うためのクラスであり、データベースの結果セットやファイルの内容など、様々なデータソースを順に処理するために使用されます。currentメソッドを使用することで、イテレータが現在指している要素の値を取得できます。

このメソッドは引数を取らず、イテレータが指す現在の要素の値を返します。もしイテレータが有効な要素を指していない場合(例えば、イテレータが初期化されていない、または最後の要素まで進んだ場合)、currentメソッドはfalseを返します。このfalseの戻り値は、イテレータの終端に達したことを示すために利用できます。

currentメソッドは、イテレータの状態を変更しません。つまり、イテレータのカーソル位置は変更されません。カーソルを次の要素に進めるには、next()メソッドを使用する必要があります。currentメソッドは、イテレータから現在の要素の値を取得する際に中心的な役割を果たし、イテレータを操作する多くの処理で利用されます。例えば、ループ処理の中で、イテレータが指す要素を順番に処理していくような場合に、currentメソッドで値を取得し、何らかの処理を行った後、next()メソッドで次の要素に進むという流れが一般的です。

基本的な使い方

構文(syntax)

1/**
2 * @return mixed
3 */
4public current(): mixed

引数(parameters)

引数なし

引数はありません

戻り値(return)

mixed

現在イテレータが指している要素の値を返します。要素が存在しない場合は null を返します。

サンプルコード

PHP: 現在のディレクトリ内容を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 現在のディレクトリ内のファイルとディレクトリの一覧を表示します。
7 *
8 * DirectoryIterator は内部で InternalIterator を実装しており、
9 * foreach ループは各繰り返しで current() メソッドを呼び出して
10 * 現在の要素(SplFileInfo オブジェクト)を取得します。
11 */
12function displayCurrentDirectoryContents(): void
13{
14    try {
15        // 現在のスクリプトファイルが存在するディレクトリを対象にDirectoryIteratorを作成
16        $directoryIterator = new DirectoryIterator(__DIR__);
17
18        echo 'Contents of ' . $directoryIterator->getPath() . ':' . PHP_EOL;
19
20        // ディレクトリ内の各要素を反復処理
21        foreach ($directoryIterator as $fileInfo) {
22            // '.' や '..' のような特殊なディレクトリはスキップ
23            if ($fileInfo->isDot()) {
24                continue;
25            }
26
27            // foreach の $fileInfo が current() メソッドの戻り値に相当します。
28            // ここではファイル名を取得して表示します。
29            echo $fileInfo->getFilename() . PHP_EOL;
30        }
31    } catch (Exception $e) {
32        echo 'Error: ' . $e->getMessage() . PHP_EOL;
33    }
34}
35
36// 関数を実行して結果を表示
37displayCurrentDirectoryContents();
38

このサンプルコードは、PHPのDirectoryIteratorクラスを利用して、スクリプトが実行されているディレクトリ内にあるファイルとサブディレクトリの名前を一覧で表示するものです。

InternalIteratorインターフェースが持つcurrent()メソッドは、foreachのようなループ処理で、配列やオブジェクトといった複数の要素の集まりを反復処理する際に、現在注目している要素を取得するために内部的に呼び出されます。このメソッドは引数を取りません。戻り値はmixed型で、コレクション内の現在の要素そのものを返します。

サンプルコードのforeach ($directoryIterator as $fileInfo)という部分では、ループが繰り返されるたびに、PHPが内部で$directoryIteratorオブジェクトのcurrent()メソッドを呼び出しています。その戻り値である、現在のファイルやディレクトリ情報を表すSplFileInfoオブジェクトが、変数$fileInfoに代入されます。これにより、ループの中で$fileInfo->getFilename()のようにして現在の要素の情報を取得し、画面に表示することが可能になっています。

このサンプルコードは、foreachループを使ってディレクトリ内の要素を処理します。DirectoryIteratorのようなイテレータをforeachで使うと、ループの各段階で内部的にcurrent()メソッドが自動で呼び出され、現在位置の要素を取得します。そのため、開発者がcurrent()を直接呼び出す必要はほとんどありません。

ループ変数$fileInfoには、ファイル名(文字列)ではなく、SplFileInfoというファイル情報を扱うためのオブジェクトが格納されます。そのため、ファイル名を取得するには$fileInfo->getFilename()のようにメソッドを呼び出す必要があります。また、ディレクトリには...といった特殊なエントリが含まれるため、isDot()でチェックし除外する処理が重要です。存在しないディレクトリを指定するとエラーになるため、try-catchによる例外処理は、安全なプログラムには不可欠です。

PHPで現在のUnixタイムスタンプを取得する

1<?php
2
3/**
4 * 現在のUnixタイムスタンプを取得し、表示する関数。
5 *
6 * この関数は、システムエンジニアを目指す初心者向けに、PHPで現在の時刻情報を
7 * 数値(Unixタイムスタンプ)として取得する基本的な方法を示します。
8 * Unixタイムスタンプは、1970年1月1日 00:00:00 UTC (協定世界時) からの秒数を表す整数です。
9 */
10function getCurrentTimestampExample(): void
11{
12    // 1. time() 関数を使って現在のUnixタイムスタンプを取得します。
13    //    これは整数値(秒数)を返します。
14    $unixTimestamp = time();
15    echo "現在のUnixタイムスタンプ (time()): " . $unixTimestamp . "\n";
16
17    // 2. DateTime クラスを使う方法もあります。
18    //    これはより高度な日時操作に適していますが、タイムスタンプの取得にも使えます。
19    //    DateTimeオブジェクトは、現在のシステム時刻とタイムゾーンに基づいて作成されます。
20    $dateTime = new DateTime();
21    $dateTimeTimestamp = $dateTime->getTimestamp();
22    echo "現在のUnixタイムスタンプ (DateTime::getTimestamp()): " . $dateTimeTimestamp . "\n";
23
24    // 取得したタイムスタンプは、date() 関数や DateTime オブジェクトのformat() メソッドを使って
25    // 人が読める形式の時刻に変換することができます。
26    echo "人が読める形式の時刻 (date() 関数): " . date('Y-m-d H:i:s', $unixTimestamp) . "\n";
27    echo "人が読める形式の時刻 (DateTime オブジェクト): " . $dateTime->format('Y-m-d H:i:s') . "\n";
28}
29
30// 関数を実行し、現在のタイムスタンプと時刻を出力します。
31getCurrentTimestampExample();
32

このPHPサンプルコードは、現在の時刻を「Unixタイムスタンプ」として取得し、それを人が読める形式に変換する基本的な方法を解説しています。Unixタイムスタンプは、1970年1月1日0時0分0秒(協定世界時)からの経過秒数を表す整数値で、システム間の時刻情報のやり取りで広く利用されます。

コードでは、まずtime()関数が紹介されています。この関数は引数を取らず、呼び出された時点のUnixタイムスタンプを整数として返します。これはPHPでタイムスタンプを取得する最も手軽な方法です。

次により高機能なDateTimeクラスを利用する方法が示されています。new DateTime()と記述することで、現在の時刻情報を持つオブジェクトが生成されます。そのオブジェクトに対してgetTimestamp()メソッドを呼び出すと、time()関数と同様にUnixタイムスタンプを整数で取得できます。

最後に、取得した数値のタイムスタンプを、date()関数やDateTimeオブジェクトのformat()メソッドを用いて、2023-10-27 10:00:00のような人が理解しやすい日付・時刻形式の文字列に変換しています。これらの処理は、ログの記録時刻を保存する場合など、システム開発における時刻を扱う場面で不可欠な技術です。

time()関数はサーバーの設定に関わらず常にUTC(協定世界時)基準のタイムスタンプを返しますが、new DateTime()はPHPのデフォルトタイムゾーン設定に依存します。このため、サーバーのタイムゾーン設定が意図しないものだと、DateTimeで取得した時刻がずれる原因となるので注意が必要です。date_default_timezone_set()関数でタイムゾーンを明示的に設定することで、この問題を回避できます。Unixタイムスタンプ自体はタイムゾーン情報を持たない純粋な秒数ですが、それを人が読める形式に変換する際にタイムゾーンが考慮されることを理解しておくことが重要です。

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