Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】SplFileObject::fwrite()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

fwriteメソッドは、SplFileObjectインスタンスが指し示すファイルに、指定された文字列を書き込むことを実行するメソッドです。このメソッドは、ファイルへのデータ出力操作を安全かつ効率的に行うために利用されます。第一引数には、ファイルに書き込みたいstring型の文字列を指定します。オプションで第二引数としてint型のlengthを指定することができ、このlengthを指定した場合、文字列の先頭から指定されたバイト数だけ、または文字列の終端に達するまでのいずれか短い方がファイルに書き込まれます。lengthが省略された場合は、指定された文字列全体がファイルに書き込まれます。

書き込みが成功すると、このメソッドはファイルに実際に書き込まれたバイト数をint型で返します。もし書き込み中にエラーが発生した場合は、falseを返します。書き込み後、ファイルポインタは書き込まれたデータのバイト数分だけ前方に移動します。このメソッドを使用する際は、対象のSplFileObjectオブジェクトが書き込みモード(例えば、'w', 'a', 'r+', 'w+', 'x+'など)で開かれている必要があります。読み取り専用モードで開かれたファイルに対してこのメソッドを呼び出すと、書き込みが失敗しエラーが発生しますので注意が必要です。ファイルへのデータ保存や更新といった操作において、書き込みの成功を適切に確認し、エラーハンドリングを行うことが重要です。

構文(syntax)

1<?php
2$file = new SplFileObject('output.txt', 'w');
3$bytesWritten = $file->fwrite('This is the content to write.');
4?>

引数(parameters)

string $data, int $length = 0

  • string $data: ファイルに書き込むデータ(文字列)
  • int $length = 0: 書き込むデータのバイト数。0を指定すると、$data の全てのバイト数が書き込まれます。

戻り値(return)

int|false

書き込まれたバイト数を整数で返します。書き込みに失敗した場合は false を返します。

サンプルコード

PHP SplFileObject::fwrite でファイルに改行を書き込む

1<?php
2
3/**
4 * SplFileObject::fwrite メソッドを使用してファイルにデータを書き込み、改行を追加するサンプルコードです。
5 *
6 * システムエンジニアを目指す初心者向けに、ファイルの作成、データの書き込み、
7 * そして特に「改行」を安全に処理する方法を示します。
8 *
9 * @param string $filename 書き込み対象のファイル名。このスクリプトと同じディレクトリに作成されます。
10 */
11function writeToFileWithNewline(string $filename): void
12{
13    echo "--- ファイル書き込み処理開始 ---" . PHP_EOL;
14
15    try {
16        // 1. SplFileObject を作成し、ファイルを開きます。
17        //    'w' モードは、ファイルが存在しない場合は新しく作成し、
18        //    存在する場合はその内容をすべて上書きします。
19        //    SplFileObject は、PHPの標準ファイル操作関数をオブジェクト指向で扱えるようにするクラスです。
20        $file = new SplFileObject($filename, 'w');
21        echo "ファイル '{$filename}' を書き込みモードで開きました。" . PHP_EOL;
22
23        // 2. 書き込むデータと改行コードを準備します。
24        //    PHP_EOL は、現在PHPが動作しているOSに適した改行コードを自動的に選択します。
25        //    これにより、Windows (\r\n) と Unix/Linux (\n) の両方で正しく改行が処理されます。
26        $dataLine1 = "最初の行のテキストです。" . PHP_EOL;
27        $dataLine2 = "これは2番目の行です。" . PHP_EOL;
28        $dataLine3 = "最後に、3番目の行を書き込みます。" . PHP_EOL;
29
30        // 3. fwrite メソッドを使用してデータをファイルに書き込みます。
31        //    fwrite は、書き込まれたバイト数(整数の場合)を返します。
32        //    書き込みに失敗した場合は false を返します。
33        $bytesWritten1 = $file->fwrite($dataLine1);
34        if ($bytesWritten1 === false) {
35            throw new Exception("1行目の書き込みに失敗しました。");
36        }
37        echo "1行目 ({$bytesWritten1} バイト) をファイルに書き込みました。" . PHP_EOL;
38
39        $bytesWritten2 = $file->fwrite($dataLine2);
40        if ($bytesWritten2 === false) {
41            throw new Exception("2行目の書き込みに失敗しました。");
42        }
43        echo "2行目 ({$bytesWritten2} バイト) をファイルに書き込みました。" . PHP_EOL;
44
45        $bytesWritten3 = $file->fwrite($dataLine3);
46        if ($bytesWritten3 === false) {
47            throw new Exception("3行目の書き込みに失敗しました。");
48        }
49        echo "3行目 ({$bytesWritten3} バイト) をファイルに書き込みました。" . PHP_EOL;
50
51        echo "ファイル '{$filename}' への書き込みがすべて正常に完了しました。" . PHP_EOL;
52        echo "このスクリプトと同じディレクトリに作成された '{$filename}' ファイルの内容を確認してください。" . PHP_EOL;
53
54    } catch (Exception $e) {
55        // ファイル操作中にエラーが発生した場合(例: 書き込み権限がない)、
56        // ここで例外を捕捉し、エラーメッセージを表示します。
57        echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL;
58    } finally {
59        // SplFileObject は、スクリプトの終了時やオブジェクトがスコープ外に出たときに
60        // 自動的にファイルを閉じます。明示的な fclose() は通常不要です。
61        echo "--- ファイル書き込み処理終了 ---" . PHP_EOL;
62    }
63}
64
65// 実行するファイル名を指定します。
66$targetFilename = 'my_output_file.txt';
67
68// 関数を呼び出してファイル書き込み処理を実行します。
69writeToFileWithNewline($targetFilename);
70
71?>

このサンプルコードは、PHP 8でSplFileObjectクラスのfwriteメソッドを使用し、ファイルにデータを書き込む方法を、特にOSに依存しない安全な改行を加えて解説しています。SplFileObjectは、PHPの標準ファイル操作関数をオブジェクト指向で扱えるようにするクラスで、ファイルの開閉や読み書きをより直感的に行えます。

まず、new SplFileObject($filename, 'w')によってファイルを「書き込みモード」で開きます。このモードでは、指定されたファイルが存在しない場合は新規作成され、既に存在する場合はその内容がすべて上書きされます。

次に、ファイルに書き込むデータと改行コードを準備します。ここで重要なのがPHP_EOL定数です。これは、PHPが動作しているOS(例えばWindowsでは\r\n、Unix/Linuxでは\n)に最適な改行コードを自動的に選択してくれるため、環境に依存しないポータブルなコードを書くことができます。

fwriteメソッドは、第一引数string $dataに指定された文字列データをファイルに書き込みます。第二引数int $lengthはオプションで、指定した場合、$dataの先頭から$lengthバイトまでを書き込みます。このメソッドの戻り値は、書き込みに成功した場合は実際にファイルに書き込まれたバイト数を示す整数、失敗した場合はfalseとなります。サンプルコードでは、この戻り値を確認することで書き込みの成否を判断し、エラーが発生した際にはtry-catchブロックで適切に処理しています。これにより、ファイルアクセス権限の問題などが発生しても、スクリプトが予期せず停止することなく、安全にエラーを通知できます。

SplFileObject::fwriteは、ファイル書き込みに失敗するとfalseを返すため、必ず戻り値を厳密にチェックしエラー処理を行うことが重要です。改行を追加する際には、OSに依存しないPHP_EOL定数を利用すると、WindowsやLinuxなど異なる環境でも正しく改行が認識され、表示崩れを防ぐことができます。SplFileObjectを生成する際のファイルオープンモードには特に注意が必要です。'w'モードはファイルが存在しない場合は新規作成し、存在する場合は内容をすべて上書きするため、誤って重要なデータを消去しないよう慎重に選択し、既存ファイルへの追記には'a'モードなどを利用してください。ファイル操作中に発生し得る権限不足などのエラーに備え、try-catch文で例外を捕捉し、適切なエラーメッセージを表示することが安全なコードのために不可欠です。SplFileObjectは通常、オブジェクトがスコープ外に出ると自動でファイルを閉じますが、不要になった時点でオブジェクトをnullにするなどでリソースを早期に解放することも可能です。

PHP SplFileObject::fwrite でUTF-8コードを書き込む

1<?php
2
3/**
4 * SplFileObject::fwrite の使用例。
5 * 日本語(UTF-8エンコーディング)の文字列をファイルに書き込みます。
6 *
7 * この関数は、システムエンジニアを目指す初心者が、
8 * PHPでファイルにデータを書き込む際、特にマルチバイト文字(日本語など)と
9 * そのエンコーディング(文字コード)がどのように扱われるかを理解するのに役立ちます。
10 *
11 * @param string $filePath 書き込み対象のファイルパス。
12 */
13function writeUtf8ToFileUsingSplFileObject(string $filePath): void
14{
15    // 書き込む日本語文字列。
16    // PHPのモダンな環境では、スクリプトや内部処理で文字列は通常UTF-8として扱われます。
17    // この文字列が含むマルチバイト文字は、UTF-8エンコーディングのバイトシーケンスとして
18    // ファイルに書き込まれることになります。
19    $dataToWrite = "これは日本語のテスト文字列です。\nHello World! 🎉\n";
20
21    try {
22        // SplFileObject を 'w' (書き込みモード) で開きます。
23        // 'w' モード: ファイルが存在しない場合は作成され、存在する場合は内容がクリアされます。
24        // これにより、常に新しいファイルとして書き込むことができます。
25        $file = new SplFileObject($filePath, 'w');
26
27        // fwrite メソッドで文字列をファイルに書き込みます。
28        // 戻り値は、実際にファイルに書き込まれたバイト数です。
29        // 書き込みに失敗した場合は false を返します。
30        // SplFileObject の fwrite は、通常の fwrite 関数と同様に、
31        // 指定された文字列のバイト表現をそのままファイルに書き込みます。
32        $bytesWritten = $file->fwrite($dataToWrite);
33
34        if ($bytesWritten === false) {
35            echo "エラー: ファイル '{$filePath}' への書き込みに失敗しました。\n";
36        } else {
37            // 書き込まれたバイト数と、元の文字列のバイト長(UTF-8でのバイト数)は一致します。
38            // mb_strlen($dataToWrite, '8bit') は、文字列をバイト列として扱った場合の長さを返します。
39            echo "ファイル '{$filePath}' に {$bytesWritten} バイトを書き込みました。\n";
40            echo "書き込んだ元の文字列のバイト長: " . mb_strlen($dataToWrite, '8bit') . " バイト\n";
41            echo "(PHPのデフォルト設定では通常UTF-8エンコーディングで処理されるため、\n";
42            echo "  このファイルもUTF-8エンコーディングとして保存されます。)\n";
43
44            // ファイルの内容を読み込み、書き込みが成功したかを確認します。
45            // SplFileObject は、オブジェクトがスコープを抜けるか unset されると
46            // 自動的にファイルハンドルをクローズします。
47            // ここでは明示的に解放 (unset) することで、ファイルをクリーンに閉じ、
48            // その後で読み取りモードで開き直します。
49            unset($file); // ファイルをクローズするため SplFileObject オブジェクトを解放
50
51            // ファイルを読み取りモード ('r') で再度開きます。
52            $file = new SplFileObject($filePath, 'r');
53            echo "\n--- ファイル '{$filePath}' の内容 ---\n";
54            foreach ($file as $lineNumber => $line) {
55                // ファイルがUTF-8で保存されているため、UTF-8として正しく表示されます。
56                echo sprintf("行 %d: %s", $lineNumber + 1, $line);
57            }
58            echo "-------------------------------\n";
59        }
60    } catch (RuntimeException $e) {
61        // SplFileObject のコンストラクタやファイル操作中に例外が発生した場合、
62        // そのエラーメッセージを出力します。
63        echo "ファイルの操作中にエラーが発生しました: " . $e->getMessage() . "\n";
64    } finally {
65        // $file オブジェクトがまだ存在する場合、ここで明示的に解放すると
66        // ファイルハンドルがクローズされます。
67        // スクリプト終了時にはPHPによって自動的にリソースが解放されますが、
68        // リソースの早期解放や確実なクローズが必要な場合に unset が役立ちます。
69        if (isset($file)) {
70            unset($file);
71        }
72    }
73}
74
75// --- サンプルコードの実行 ---
76// 一時的なファイル名を指定します。
77$tempFileName = 'output_splfileobject_utf8_example.txt';
78
79// 関数を実行してファイルに書き込みます。
80writeUtf8ToFileUsingSplFileObject($tempFileName);
81
82// --- 後処理 ---
83// 作成されたファイルは、システムやアプリケーションの要件に応じて永続化するか、
84// 適切なタイミングで削除する必要があります。
85if (file_exists($tempFileName)) {
86    echo "\n注意: ファイル '{$tempFileName}' が作成されました。内容を確認後、手動で削除してください。\n";
87    // 自動的にファイルを削除したい場合は、以下のコメントを解除してください。
88    // unlink($tempFileName);
89    // echo "ファイル '{$tempFileName}' を削除しました。\n";
90}
91
92?>

SplFileObject::fwriteは、PHPのSplFileObjectクラスを通じて、開いているファイルへデータを書き込むためのメソッドです。主に、ファイルに文字列データを保存する際に利用されます。

第一引数の$dataにはファイルに書き込みたい文字列を指定します。PHP 8の環境では、通常、文字列はUTF-8として処理されるため、日本語のようなマルチバイト文字も特別な設定なしに正しくファイルへ書き込めます。これは、PHPが内部的にUTF-8を標準の文字エンコーディングとして扱うため、明示的な変換作業が不要であることを意味します。

第二引数の$lengthは省略可能で、指定すると$dataの先頭から指定したバイト数だけを書き込みます。通常は省略し、文字列全体を書き込みます。

このメソッドは、実際にファイルに書き込まれたバイト数を整数で返します。もし書き込み処理が失敗した場合はfalseを返しますので、ファイルの書き込みが成功したかを確認するために、戻り値を常にチェックすることが重要です。

サンプルコードでは、日本語を含むUTF-8文字列をファイルに書き込み、書き込まれたバイト数と元の文字列のバイト長が一致することを確認しています。SplFileObjectを利用することで、ファイル操作をオブジェクトとして扱え、ファイルオープン時のエラーや書き込み失敗時の例外処理もtry-catchブロックで管理しやすくなります。また、オブジェクトが不要になった際にunsetするか、スクリプト終了時に自動でファイルがクローズされるため、リソース管理も簡潔に行えます。このメソッドは、システムエンジニアを目指す方がPHPでファイルへのデータ書き込み、特にマルチバイト文字の扱い方を理解する上で基本的な知識となります。

PHP 8では文字列が通常UTF-8で処理されるため、SplFileObject::fwriteで書き込むとファイルもUTF-8エンコーディングで保存されます。もし異なる文字コードでファイルを作成したい場合は、書き込み前にmb_convert_encoding関数などを用いて文字列を適切に変換する必要があります。fwriteの戻り値は、実際にファイルに書き込まれたバイト数を示します。書き込みに失敗した場合はfalseを返すため、必ずこの戻り値を確認し、エラー処理を行うようにしてください。SplFileObjectを初期化する際のファイルモード(例: 'w'は上書き、'a'は追記)は、ファイルの既存内容の扱いを決定するため非常に重要です。目的に応じて適切なモードを選びましょう。また、ファイル操作完了後はunset($file)で明示的にオブジェクトを解放することで、ファイルハンドルが確実にクローズされ、リソースを安全に管理できます。

関連コンテンツ