[模擬問題] PHP7初級 – ファイルの操作(エバンジェリスト三雲勇二からの出題)

PHP7初級試験 模擬問題 – 出題範囲: ファイルの操作 からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!

目次

問題

次の選択肢のなかで、正しいものはどれでしょう? (1つ選択)

  1. file_get_contents() 関数でローカルファイルを読み込み、file_put_contents() 関数でローカルファイルに書き込むことができるが、両関数ともリモートファイルには対応していない
  2. ファイルを一部分ごとに読み込む場合は、open() 関数でファイルを開き、gets() 関数でデータを取得し、close() 関数でファイルを閉じる
  3. CSV ファイルを読み込む際には、特別に file_get_csv() 関数が用意されている
  4. file_get_contents() 関数でファイルが読み込めなかった場合、戻り値に false が返ってくる
  5. ファイルを開くときにファイルモードを ‘ab+’ と指定すると、ファイル追記モードで開けるが、ファイルがない場合はエラーになる

解答と解説は下にスクロールしてください





























解答

正解は 4. です。

解説

1. file_get_contents() 関数でローカルファイルを読み込み、file_put_contents() 関数でローカルファイルに書き込むことができるが、両関数ともリモートファイルには対応していない

file_get_contents() 関数や file_put_contents() 関数は、適切なアクセス権限があればリモートファイルにも対応しています。

特に PHP でファイルを読み書きの際によく使うものが file_get_contents() 関数です。
ローカル内にあるテキストファイルや JSON ファイル、YAML ファイルなどを読み込んだり、他の Web サイトのリモートファイルも読み込むことが可能です。
ただし、PHP ファイルをスクリプトとして読み込む場合は、require()require_once()include()include_once() 等の関数を使用することに気をつけてください。

file_put_contents() 関数はファイルを書き込みするディレクトリなどに適切に権限が必要となります。
一般的なサーバー環境では、読み込み権限は付与されていることが多いのですが、書き込み権限は付与していないことが多いためです。

【試験合格後もステップアップ!】

file_get_contents() 関数と file_put_contents() 関数は一度にファイルを読み込む仕様ですので、メモリの使用量を考慮する必要があります。
つまり、大きなファイルを読み書きするものには向いていません。
大きなファイルを取り扱うとメモリを圧迫し、処理が遅くなるだけでなく処理ができなくなることもよくあります。
リモートファイルの大きなファイルを読み書きする場合には、ネットワーク速度も関係してくるのでさらに処理が遅くエラーになる可能性が高まります。

とくに、ログファイルなどをログローテーションをせず運用していると、運用後に徐々にファイルが肥大化することがよくあります。
ファイルが運用中に肥大化することが予想される場合は、1 日毎にどのくらいファイル容量が増えるか計算し、事前に 1 年後や 3 年後の想定をすることも必要です。

2. ファイルを一部分ごとに読み込む場合は、open() 関数でファイルを開き、gets() 関数でデータを取得し、close() 関数でファイルを閉じる

fopen() 関数でファイルを開き、fgets() 関数でデータを取得し、fclose() 関数でファイルを閉じます。

file_get_contents() 関数と違う点は、一度にファイルを読み込まず、一部分ずつファイルを読み込むことができます。

  1. fopen() 関数でファイルを開きます。
  2. fgets() 関数でデータを部分ごとに読み込みます。while などでループして処理することが多いです。
  3. fclose() 関数でファイルを閉じます。

同様に file_put_contents() 関数の代わりにこちらの方法を適用すると、下記のような順序でコードを組み立てます。

  1. fopen() 関数でファイルを開きます。
  2. fwrite() 関数でデータを部分ごとに書き込みます。while などでループして処理することが多いです。
  3. fclose() 関数でファイルを閉じます。

【試験合格後もステップアップ!】

選択肢 1. で問題になったメモリ使用率を回避する場合には、こちらの方法を使用します。

3. CSV ファイルを読み込む際には、特別に file_get_csv() 関数が用意されている

PHP に file_get_csv() 関数は存在しません。

CSV ファイルを読み込む際に特別に用意されている関数は fgetcsv() 関数です。 fgets() 関数と同じように使用します。

  1. fopen() 関数でファイルを開きます。
  2. fgetcsv() 関数でデータを1行ごとに書き込みます。取得されるデータはカンマで区切られた配列として取得されます。while などでループして処理することが多いです。
  3. fclose() 関数でファイルを閉じます。

【試験合格後もステップアップ!】

CSV は Comma Separated Values の頭文字を取ったものですが、こちらは別に覚えなくても構いません。
大事なことは『項目がカンマ , で区切られたテキストファイル』であることを把握してください。
この CSV は、他のプログラムとの入出力で昔からよく使われるフォーマットです。

よく使われるケースとして、Excel のファイルの入出力です。
Excel で入出力される CSV ファイルはエンコードが Shift_JIS であることが多いため、読み込みと書き込み時はエンコーディング変換を意識してください。
あくまでも読み込んだ後は UTF-8 エンコードに統一して処理することも忘れないでください。

少し話はずれますが、CSV を経由せず Excel ファイルをやり取りする方法もあります。
Composer などで PhpSpreadsheet パッケージなどを導入すれば利用できます。
この場合のデメリットは、Excel 以外のデータが処理できなくなります。

Excel フォーマットと CSV フォーマットのどちらを採用すべきか迷ったときは、CSVのメリットとして
・様々なアプリケーションでサポートされているため、汎用性が高い
・テキストファイルなので、Windows であればメモ帳で簡単にデータを確認ができる
という差がありますので、どちらがよいか検討してみてください。
一般的には、ネットに情報が多く実装が簡単な CSV をお勧めします。

4. file_get_contents() 関数でファイルが読み込めなかった場合、戻り値に false が返ってくる

選択肢のとおりです。

ファイルが読み込めなかった場合として、次のようなコードを例にします。

// sample.txt が存在しない場合
$file = file_get_contents('sample.txt');

if ($file === false) {
    echo 'ファイルがありません。', PHP_EOL;
}

ファイルが存在しない場合、$file には false が代入されています。
このとき、$file == false とイコールを 2 つ == にしてはいけません。

先程の sample.txt に 0 と言う文字が1文字だけ書かれているとします。
この場合、$file には '0' が代入されています。 == で比較すると、型を自動変換したうえで比較されます。
'0' は bool 型に自動変換されると false になります。

つまり、ファイルは存在するのにエラーと判定されるバグとなります。
このように想定しない動作を引き起こすため、比較する際には型も含めた厳密な比較が推奨されます。

【試験合格後もステップアップ!】

PHP の特徴として、失敗した場合に null ではなく false を返す関数が多数存在します。
このような関数の戻り値を false 疑似型と呼ぶこともあります。
これは気軽にプログラミングできる歴史的経緯に基づくものです。

PHP は大規模開発でも利用されるようになり、バグを防ぐために型を意識するプログラミングに移行しつつあります。
型を意識しないプログラミングのままですと false と自動的に判定される数値や文字が多数あるため、本当に関数の処理が失敗したのか、false としても自動で判定される文字がたまたま入っているのか分かりません。

false 疑似型は PHP 8.0 で union 型が導入されたことにより、厳密な戻り値として指定できるようになりました。
また、現在リリースに向けての準備中の PHP 8.2 の仕様に、false 疑似型を単独で使用できる提案が提示され可決されているようです。
その際には、false というキーワードにもう一つ特別な意味が増えることになります。
興味のある方は、「false 疑似型」や「Falsy」で検索してみてください。

5. ファイルを開くときにファイルモードを ‘ab+’ と指定すると、ファイル追記モードで開けるが、ファイルがない場合はエラーになる

ab+ ファイルが存在しない場合には作成を試みます。

覚え方としては、下記のパターンで覚えてください。

  • 1文字目は、r:読み込み、w:書き込み、a:追記書き込み、x:新規作成
  • 2文字目は、b:バイナリー、t:テキスト、省略すると b と同じ
  • 3文字目は、+:読み書き両方対応にする場合のみつける

【試験合格後もステップアップ!】

ファイルモードを指定する場合、当然そのファイルやディレクトリに対し適切なアクセス権が必要です。
エラーになる場合は、ここも確認が必要です。

CentOS や Ubuntu などの Linux 系や Mac など Unix 系では、アクセス権として主に下記 2 つを考慮してください。
・所有者: オーナーとグループを確認します。
・パーミッション: 読み込み、書き込み、実行を、それぞれオーナーグループとその他にそれぞれ指定します。644 のような数字で表現されることもあります。

少し話は脱線しますが、数字でパーミッション指定する場合は 0644 のように 4 桁指定できます。
入力時に想定せず 4 桁で入力していないか注意してください。
このとき 4 桁目(先頭の 1 文字目)は特別なアクセス権を設定します。
シンボルモードでも特別なアクセス権は設定できます。
特殊なアクセス権に 0 以外が入力されているときは注意が必要です。

特殊なアクセス権には下記のものがあります。
・スティッキービット: 全ユーザーが書き込めるが、削除は所有者オーナーのみが可能。ディレクトリのみ設定可能。
・SUID: 必ず所有者オーナーの権限で実行されます。実行権のあるファイルのみ設定可能。
・SGID: 必ず所有者グループの権限で実行されます。実行権のあるファイルとディレクトリに設定可能。

この特別なアクセス権が設定されているレアなケースもあるので、ファイルが削除できない場合などは特に「スティッキービット」にも注意して確認してみてください。

試験の情報

PHP7初級試験 の詳細およびキャンペーン情報はこちら
https://www.phpexam.jp/summary/novice7/

PHP カンファレンス 2022 情報

PHP ユーザーが集まる PHP カンファレンス 2022 が今年も 9月24日(土) 〜 25日(日) の日程で開催されます!

今年はオンラインと現地オフラインの参加が可能です。参加費は無料です。
この記事を書いている私(三雲)も、当日スタッフとLT発表で現地オフライン参加します。
会場でお会いした際には、どうぞよろしくお願いいたします!

PHP Confarence 2022 オンライン参加&オフライン参加 申し込みページ
https://phpcon.connpass.com/event/255324/

PHP Confarence 2022 公式ページ
https://phpcon.php.gr.jp/2022/

模擬問題作成及び解説

三雲 勇二
プライム・ストラテジー株式会社 所属。PHP 技術者認定機構で実施している 7 試験 ( PHP8上級 / PHP5上級 / PHP7初級 / PHP5初級 / 徳丸実務 / 徳丸基礎 / KUSANAGI for WordPress ) 含め多数の試験に合格。ペチゾーをデスク周りにおいて日々お仕事しています。
Facebook: facebook.com/yuji.mikumo
Twitter: @maikeru

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次