概要

PHP には「ファイルを読む」関数が 手軽さ重視制御性重視 の 2 系統ある。手軽さの代表が file_get_contents($path)。パスを渡すだけで ファイル全体を 1 つの文字列として返してくれる。設定ファイルや小さなテキストならこの 1 行で十分。

もう一方の制御性重視が fopen + fgets + fclosefopen('path', 'r') でハンドルを取り、fgets($fp)1 行ずつ 読み、用が済んだら fclose($fp) で閉じる。手間は増えるが、ループしながら少しずつ処理できるので ギガ単位の大きなファイル でもメモリを食い潰さない。「メモリと手軽さのトレードオフ」と覚えると選び分けが楽。

ファイル系関数では パスの組み立て にも注意。スクリプトの隣にあるファイルを指したいとき、ただ 'data.txt' と書くとカレントディレクトリ依存で事故る。__DIR__ . '/data.txt' のように __DIR__ を起点に組む のがイディオム (__DIR__ は「このファイルが置かれているディレクトリの絶対パス」)。ch05 でパス操作を本格的に扱うが、ここでも先取りで使う。

学習目標

ドリル

# 内容
01-read-all/ tests/data/hello.txt の中身をそのまま出力
02-read-line-by-line/ fgets で 1 行ずつ読み、先頭に 行番号 を付けて出力

確認のコツ

演習: ドリル 01 — ファイル全体を読む

問題

__DIR__ . '/tests/data/hello.txt' の中身を そのまま標準出力に出す PHP を書いてください。

データファイル (tests/data/hello.txt):

こんにちは
ファイル読み込みのテスト

期待される出力:

こんにちは
ファイル読み込みのテスト

(末尾の改行はファイルに含まれている前提。echo で追加の "\n" を足さない)

ヒント

$path = __DIR__ . '/tests/data/hello.txt';
echo file_get_contents($path);

つまづいたら

演習: ドリル 02 — 1 行ずつ読んで行番号を付ける

問題

__DIR__ . '/tests/data/poem.txt'1 行ずつ 読み、各行の先頭に "N: " (N は 1 始まりの行番号) を付けて出力する PHP を書いてください。

データファイル (tests/data/poem.txt):

春はあけぼの
やうやう白くなりゆく山ぎは
すこしあかりて
紫だちたる雲のほそくたなびきたる

期待される出力:

1: 春はあけぼの
2: やうやう白くなりゆく山ぎは
3: すこしあかりて
4: 紫だちたる雲のほそくたなびきたる

ヒント

$fp = fopen(__DIR__ . '/tests/data/poem.txt', 'r');
$n = 1;
while (($line = fgets($fp)) !== false) {
    echo $n . ': ' . rtrim($line, "\r\n") . "\n";
    $n++;
}
fclose($fp);

つまづいたら

この章を AI に聞く

  1. 「ch02 — ファイルを読む」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch02 — ファイルを読む」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch02 — ファイルを読む」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch02 — ファイルを読む」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE