【PHP初学者向け】ファイルの書き込み・書き出しの方法を紹介します

今回はPHPを使ったファイルの書き込み・書き出し方法を紹介していきます。

方法は主に3つで、ファイル名型、ストリーム型、オブジェクト型があります。

難しく聞こえますが、「とりあえず3つ方法があるんだ」くらいでいいと思います。

それよりも、ファイルの書き出し・書き込み実装は、プログラミングの本質でもあるので、面倒くさがらずにしっかり学習していきましょう。

versions
  • PHP 8.0.0

ストリームとは何かを知ろう

とは、言ったもののストリームが気になるので、ちょこっと調べてみました。

外部からデータを順々に入力したり,外部へデータを順々に出力し
ていくような方法である。Javaをはじめ,多くのプログラミング言語では,このような入出
力を,ストリーム(stream)という概念で表現している。

プログラミング応用b 第5回 『ファイル入出力の基礎1』
 -01 2種類の入出力方法(ランダムアクセス入出力とストリーム入出力)

どうやらストリームオブジェクトという抽象クラスを介して、一連の流れとしてデータを入出力できるらしいです。

オブジェクト型は、メソッドとして定義しているので使いやすそうですが、ストリーム型との違いがいまいちわかりませんでした。。。
わかる方教えてください。。。

ファイルへ書き込みをしよう

とりあえずややこしいことは抜きにして、書いてみることにしました。

とりあえず進めてみて、後から理解できるなんてこともあるので、時期をみてまた勉強し直すことも大切です。

今回は同じディレクトリに「test.txt」というテキストファイルを作成しておこなっています。

1. ファイル名型

<?php
  $file = './test.txt';

  //  ファイルの中身を上書きする
  file_put_contents($file, 'test');

  // ファイルに追記する
 $addText = 'test'. "\n";
  file_put_contents($file, $addText, FILE_APPEND);
?>

ファイル名型の場合は、

file_put_contents

を使用するのですが、通常通り使用すると上書きされてしまいます。

上書きされたくない場合は、FILE_APPENDオプションを使用しましょう。

2. ストリーム型

<?php
  $contents = fopen($file, 'a+');

  $addText = 'test'. "\n";
  fwrite($contents, $addText);

  fclose($contents);
?>

openから始まり、closeで終わる。

一連の流れで捉えるということがなんとなくわかるような気がします。

3. オブジェクト 型

<?php
  $file = new SplFileObject('test.txt', 'a+');
  $file->fwrite('追記です'."\n");
?>

個人的にはオブジェクト型が一番わかりやすい気がします。。。直感的に使える感じです。

ファイルから書き出しをしよう

続いて書き出しです。

書き込みと同じ要領なのでサクサクとやっていきましょう。

1. ファイル名型

<?php
  $file = './test.txt';

  $fileContents = file_get_contents($file);

   echo $fileContents;
?>
file_get_contents

putとgetの違いなので、わかりやすいですね。

ストリーム型

<?php
  $contents = fopen($file, 'a+');

  $content = fread($contents, filesize($file));
  echo $content;

  fclose($contents);
?>

fwriteからfreadに変わりましたね。

オブジェクト型

<?php
  $file = new SplFileObject('test.txt', 'a+');
  foreach ( $file as $line ) {
    echo $line;
 }
?>

test.txtの中身を読み込んだあとは、foreachを使用してループさせています。

foreachに関しては、【初学者は要復習】PHPで配列の書き方を解説しますで紹介していますので、ご参考ください。

僕がrubyの勉強をやっていたからなのか、オブジェクト型がやっぱりしっくりきます。。。

まとめ

  • ファイル名型、ストリーム型、オブジェクト型の3つの方法がある
  • ストリームとは一連の流れとして処理を捉える

いまいち使い分けも分からなかったので、詳しい方はぜひ教えてください。。。

参考

PHPファイル操作機能一覧

ストリーム

ファイルシステム

fopen

プログラミング応用b 第5回 『ファイル入出力の基礎1』

ストリーム 【stream】