概要

ファイルを扱う場面で常に付きまとうのが パス の問題。パスには 絶対パス (/Users/foo/data.txt のように / から始まる) と 相対パス (./data.txt のように現在地基準) があり、相対パスは 「どこから動かしているか」で結果が変わる ため事故りやすい。「スクリプトから見て隣のファイル」を確実に指すために PHP には __DIR__ (このファイルのディレクトリ絶対パス) と __FILE__ (このファイル自身) という定数がある。

パスは文字列なので、分解する関数群がある。dirname('/a/b/c.txt')'/a/b'basename(...)'c.txt'pathinfo(...)dirname / basename / filename / extension連想配列で一気に 取れる。拡張子を抜き出したい pathinfo($path, PATHINFO_EXTENSION) は頻出イディオム。絶対パスへ正規化したいなら realpath() がシンボリックリンクや .. を解決してくれる。

ディレクトリ内一覧は scandir($dir)。注意点は戻り値に必ず . (カレント)・.. (親) が混じる こと。array_diff($files, ['.', '..']) で除く定型処理。順序は OS 依存なので揃えたいなら sort($files) を明示する。__DIR__ / pathinfo / scandir の 3 点セット はファイル処理コードの「正しい型」。

学習目標

ドリル

# 内容
01-path-info/ 与えられたパス文字列を分解して各部分 (dir / basename / filename / extension) を出力
02-list-dir/ tests/data/sample/ 配下のファイル名一覧 (. .. を除く) をソートして出力

確認のコツ

演習: ドリル 01 — `pathinfo` でパスを分解する

問題

以下のパス文字列を pathinfo で分解し、4 つの要素 (dirname / basename / filename / extension) を コロン + 半角スペース 区切りで 1 行ずつ出力してください。

$path = '/var/www/logs/access.2026-05-19.log';

期待される出力:

dirname: /var/www/logs
basename: access.2026-05-19.log
filename: access.2026-05-19
extension: log

ヒント

$info = pathinfo($path);
echo "dirname: {$info['dirname']}\n";
echo "basename: {$info['basename']}\n";
echo "filename: {$info['filename']}\n";
echo "extension: {$info['extension']}\n";
キー 中身
dirname ディレクトリ部分 (/var/www/logs)
basename ファイル名 (拡張子付き) (access.2026-05-19.log)
filename ファイル名 (拡張子なし) (access.2026-05-19)
extension 拡張子 (log — 先頭の . は付かない)

つまづいたら

演習: ドリル 02 — `scandir` でディレクトリ一覧

問題

__DIR__ . '/tests/data/sample' 配下のファイル名を、... を除いた 上で 昇順 にソートして 1 行ずつ出力してください。

tests/data/sample/ の中身 (このリポジトリにコミット済み):

apple.txt
banana.txt
cherry.txt

期待される出力:

apple.txt
banana.txt
cherry.txt

ヒント

$dir = __DIR__ . '/tests/data/sample';
$files = array_values(array_diff(scandir($dir), ['.', '..']));
sort($files);
foreach ($files as $f) {
    echo $f . "\n";
}

つまづいたら

この章を AI に聞く

  1. 「ch05 — パス操作とディレクトリ走査」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch05 — パス操作とディレクトリ走査」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch05 — パス操作とディレクトリ走査」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

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

ch05 — パス操作とディレクトリ走査」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE