[模擬問題] PHP7初級 – デバッグとテストと開発の心得(エバンジェリスト三雲勇二からの出題)

PHP7初級試験 模擬問題 – 出題範囲: デバッグとテストと開発の心得 からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!

目次

問題

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

  1. エラーの種類は主に、Notice、Warning、Error、Critical などがある
  2. error_reporting() 関数でエラー出力を変更でき、引数に 0 を設定するとすべてのエラーが出力されない
  3. 変数の内容を確認するには、var_dump() 関数や echo() 関数、debug() 関数などを使用するとよい
  4. アップロードファイルの最大サイズを一時的に変更するには、ini_set() 関数で upload_max_filesize を変更する
  5. ユーザーから入力されたデータは、クライアント側もしくはサーバー側のどちらかで必ずチェックする

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





























解答

正解は 2. です。

解説

1. エラーの種類は主に、Notice、Warning、Error、Critical などがある

PHP に Critical という種類のエラーはありません。

PHP で表示される主なエラーには下記のようなものがあります。

  • Notice: 注意。軽微な問題です。ウェブサイトによっては対応しなくても良いと書かれていることもありますが、基本は対応することが望ましいです。
  • Warning: 警告。PHP の実行は継続しますがエラーです。
  • Fatal Error: エラー。PHP の実行が中断されるエラーです。
  • Parse Error: エラー。PHP の文法エラーです。PHP の実行はできませんので中断されます。
  • Deprecated: 非推奨。PHP の実行は継続されます。非推奨の関数などを使用している際に表示されるエラーです。将来的な PHP でエラーとなる可能性があるので対応が必要です。
  • Strict Standards: 古い構文など。PHP の実行は継続されます。PHP の古い構文を使用している場合に表示されます。将来的な PHP でエラーとなる可能性があるので対応が必要です。

この中で PHP の実行が中断されるのは Fatal Error と Parse Error のみです。

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

php.inierror_reporting の初期値は E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED です。
これは、Notice と Strict、Deprecated を表示しない設定になっているという意味です。

PHP 8.0 以降では php.inierror_reporting の初期値が 0 となり、すべてのエラーが表示されるようになりました。

PHP 8.0 より前のバージョンから PHP 8.0 にアップグレードする前に、こちらのエラーを表示されるように一度設定を変更の上、潰せるエラーは潰しておくことをお勧めします。

2. error_reporting() 関数でエラー出力を変更でき、引数に 0 を設定するとすべてのエラーが出力されない

選択肢のとおりです。

error_reporting() 関数の引数に 0 を設定すると、すべてのエラー出力がされません。
すべてのエラーを出力するには、引数に定義済みのエラーレベル E_ALL 定数を指定するのが一般的です。

// 全てのエラー出力をオフにする
error_reporting(0);

// 全てのエラーを表示する
error_reporting(E_ALL);

開発環境ではすべてのエラーを確認することが望ましいため E_ALL 定数をできるだけ使うことをお勧めします。

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

E_ALL 定数のような定義済みのエラーレベル定数は、PHP の中で定義されているものになります。
例えば、Apache の .htaccesshttpd.conf など、PHP 以外で設定するときにはこの定数は使えません。代わりに値を使います。
エラーレベル定数と値は公式の下記ページから確認できます。

定義済みエラーレベル定数
https://www.php.net/manual/ja/errorfunc.constants.php

この中で E_ALL 定数を確認すると、値は 32767 と書かれています。
ただし、E_ALL 定数のみ特別に値は 32767 を使わず、 -1 もしくは 2147483647 を使用します。
値に -1 もしくは 2147483647 を指定しておくと、仮に将来の PHP バージョンで新しいレベルと定数が追加されたとしても、すべてのエラーを表示するようになります。 

また、error_reporting() 関数の設定値は ini_set() 関数を使用しても設定できます。

// 全ての PHP エラーを表示する
ini_set('error_reporting', E_ALL);

3. 変数の内容を確認するには、var_dump() 関数や echo() 関数、debug() 関数などを使用するとよい

debug() 関数というものは存在しません。
また、echo は厳密には関数ではなく言語構造です。

次のような使い方をします。

// echo で変数の中身を確認する例
$a = 1;
echo "a: $a";

// var_dump() で変数の配列の中身を確認する例
$b = [1, 2, 3];
var_dump($b);

echo では配列の出力時にエラーとなりますので、基本はまず var_dump() 関数を使用すると良いでしょう。

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

echo とよく似たものとして print() があります。
echoprint() は基本的にできることは同じなのですが、次のような違いがあります。

echo は言語構造で、カンマ区切りで複数出力できます。

echo $a, $b, $c;

print() も言語構造なのですが、こちらはカンマ区切りで複数出力はできません。
代わりに式であり、戻り値として常に 1 を返すという特徴があります。
これは if 文の条件式内で true として使用できますが、あまりこのような使い方はしません。
また、他の言語を使ったことのある初心者には、 print() のほうが馴染み良いかもしれません。

PHP ではプログラマが自由に表記できるよう、同じことをするにも何通りも手段が用意されています。
今回の場合では、どちらを使うべきか迷ったときは echo を使用することをお勧めします。
大事なことは、どちらか 1 つの表記に統一しておくことです。

4. アップロードファイルの最大サイズを一時的に変更するには、ini_set() 関数で upload_max_filesize を変更する

ini_set() 関数で一時的に PHP の設定値を変更することができます。
ただし、 upload_max_filesize の設定値は ini_set() 関数で変更することができない設定値となっています。

ini_set() で変更できるものは、下記ページリンクのリストの中で、変更可能が PHP_INI_USER または PHP_INI_ALL のものになります。

php.ini ディレクティブのリスト
https://www.php.net/manual/ja/ini.list.php

upload_max_filesize の項目を見ると、 PHP_INI_PERDIR と書かれていますので ini_set() 関数では設定できないことがわかります。

変更可能の欄に書かれている PHP_INI_* モードの定義は次のとおりです。

  • PHP_INI_USER: ユーザースクリプト、Windows レジストリまたは .user.ini で設定可能なエントリ
  • PHP_INI_PERDIR: php.ini.htaccesshttpd.conf あるいは .user.ini で設定可能なエントリ
  • PHP_INI_SYSTEM: php.ini または httpd.confで設定可能なエントリ
  • PHP_INI_ALL: どこでも設定可能なエントリ

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

ファイルアップロードの最大サイズを変更するため、php.ini に設定したのに反映されない場合に考えられることとして次のようなことがあります。

まず、 upload_max_filesize 以外の値も変更する必要な値があります。

post_max_size : POST データの最大サイズ
memory_limit : スクリプトの使用メモリの制限値

ここで値の関係性は、 memory_limit >= post_max_size >= upload_max_filesize になる必要があります。

また、大きなファイルをアップロードするときには PHP スクリプトの実行時間がかかりますので、こちらの制限に引っかかる可能性もあります。

max_execution_time : スクリプトの実行時間
max_input_time : スクリプトの入力受付時間

ほかに Web サーバーの設定値も関わってきます。
Nginx の場合は、設定ファイルの client_max_body_size ディレクティブの値などを変更する必要もあります。

最後に、各種設定値を変更した後に反映させるため、PHP-FPM や Web サーバーの再起動などを行う必要があります。

5. ユーザーから入力されたデータは、クライアント側もしくはサーバー側のどちらかで必ずチェックする

ユーザーから入力されたデータは、必ずサーバー側でチェックする必要があります。

ブラウザで入力されたデータを JavaScript でチェックすることがありますが、これは主にユーザビリティを向上させるために使用されるものです。
データをクライアント側だけでチェックした場合、通信を途中で書き換える攻撃をされる可能性があります。
また、悪意のあるユーザーが加工したデータを送信してくる可能性もあります。
この場合、サーバー側でチェックを怠ると、不適切なデータを処理することになります。

セキュリティの原則として、他から受信したデータを基本的に信用してはいけません。
必ずサーバー側で確認するようにしましょう。

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

PHP 7 初級レベルではウェブ・セキュリティの基本を押さえただけにとどまりますので、実務ではもう少し深く知っておく必要があります。
ウェブ・セキュリティの名著として知られる徳丸浩氏による「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」では、より丁寧で詳細にウェブ・セキュリティについて学ぶことができますのでおすすめです。
上記の本は「ウェブ・セキュリティ基礎試験(通称:徳丸基礎試験)」の主教材でもあります。

ウェブ・セキュリティ基礎試験(徳丸基礎試験)
https://www.phpexam.jp/tokumarubasic/

徳丸基礎試験は Python や Ruby on Rails などの PHP 以外の言語で Web アプリケーションを作成されている方にも非常に有益な試験となっております。
知識としても実務としても PHP 関わらず幅広く使えるため、ウェブに関わるエンジニアに私が一番オススメしている試験が「徳丸基礎試験」だったりします。
PHP 7 初級を合格した方は、徳丸基礎試験もぜひチャレンジしてみてください!

試験の情報

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

無料ウェブセミナーのお知らせ

2022年12月7日(水) にオンラインで『PHP8とPHPの教え方解説セミナー』を無料で開催いたします。
エバンジェリストの私こと三雲も「PHP 8 初心者向け」のテーマで登壇いたします。
こちらのご参加も、どうぞよろしくお願いいたします!

PHP8とPHPの教え方解説セミナー(12月7日@ONLINE)
https://www.phpexam.jp/2022/09/16/php%EF%BC%98%E3%81%A8php%E3%81%AE%E6%95%99%E3%81%88%E6%96%B9%E8%A7%A3%E8%AA%AC%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC12%E6%9C%887%E6%97%A5online/

お申し込みページ(Peatix)
https://peatix.com/event/3359447/view

模擬問題作成及び解説

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

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

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