こんにちは。PHP技術者認定機構 CTOの古庄道明です。
今日もPHP8初級試験の模擬問題と解説を紹介します。
以下を解いて出題のイメージと知識を補っていただけると幸いです。
(問題)
次のコードに関する記述のうち、誤っているものはどれか。
[ コード ]
【A】
【B】ここにプログラムの概要をコメントとして記述する。
print 【C】 …【D】 Your Name:
Say Hello
END;
?>
(選択肢)
選択肢1
【A】にPHPの開始タグ「<?php」を記述すると、PHPエンジンはその直後からPHP終了
タグまでの間にあるコマンドを実行する。
選択肢2
【B】の行に「//」や「#」を記述するとコメント行としてPHPエンジンに無視される。
「/」と「/」でくくることで複数行にわたるコメントを記述することもできる。
選択肢3
【C】に「>>>START」を記述すると、その直後から「END」の直前までがヒアドキュ
メントとしてprint命令に渡され表示がなされる。
選択肢4
【D】行の「$_SERVER[PHP_SELF]」は特別なPHP変数であり、現在のページの、プロ
トコルやホスト名を含まないURLが含まれる。
選択肢5
このプログラムは、userの値をサブミットするHTMLフォームを出力するものである。
(回答と解説)
選択肢1を見ていきましょう。
PHPは、HTMLの中に埋め込んで書けるスクリプト言語です。
PHPのコードは、「」までの範囲がPHPとして認識され、その間に書
かれた命令がPHPエンジンによって実行されます。
を 終了タグといいます。
たとえば、次のように書くと、ブラウザには「Hello, PHP!」という文字が表示されま
す。
このように、「」
は「ここまでがPHPコード」という区切りを示します。
なお、PHPの終了タグ「?>」は、スクリプトの最後では省略しても構いません。
特に実務の現場では、不要な空白や改行が出力されるのを防ぐため、省略することが
推奨されるケースが多くあります。
また、短縮タグ「<?」も存在しますが、環境によっては無効になっている場合があり
ます。
そのため、常に「<?php」を使うのが安全で推奨される書き方です。
したがって、選択肢にある
【A】にPHPの開始タグ「<?php」を記述すると、PHPエンジンはその直後からPHP終了
タグまでの間にあるコマンドを実行する。
という説明は、正しい内容です。
(参考:PHP公式マニュアル「PHPタグ」
https://www.php.net/manual/ja/language.basic-syntax.phptags.php )
選択肢2を見ていきましょう。
プログラムの中で、説明やメモなどを残すために使うのがコメントです。
コメントとして書かれた部分は、PHPの処理から読み飛ばされ、実行の対象にはなり
ません。
PHPでは、コメントの書き方がいくつかあります。
1行だけのコメントには、次のように「//」または「#」を使います。
ただし、最近の多くのプロジェクトでは「//」での1行コメントが主流です。
「#」は古いコードや設定ファイルなどでは見かけることがありますが、実務のPHPコ
ードではほとんど使われなくなっています。
また、複数行にわたる長いコメントを記述したい場合は、「/」と「/」で囲みます。
これらはいずれも、プログラムの実行には影響しません。
処理の意図をメモしたり、後で読む人への説明を書いたりするのに使われます。
したがって、選択肢にある
「【B】の行に「//」や「#」を記述するとコメント行としてPHPエンジンに無視される。
「/」と「/」でくくることで複数行にわたるコメントを記述することもできる。」
という説明は、正しい内容です。
(参考:PHP公式マニュアル「コメント」
https://www.php.net/manual/ja/language.basic-syntax.comments.php )
選択肢3を見ていきましょう。
PHPでは、複数行の文字列をまとめて書きたいときに「ヒアドキュメント(heredoc)」
という構文が使えます。
ヒアドキュメントは、文字列を「<<<」で始め、続けて任意の識別子(ID)を書き、
その識別子と同じ名前で閉じる書き方です。
たとえば次のように書くことができます。 Your Name:
Say Hello _START_; ?>
この場合、「<<< START」で始まり、「START」で終わります。
つまり、開始と終了には同じ識別子を使う必要があります。
選択肢のように「END」と書くと、PHPは「文字列の終わりが見つからない」と判断
して構文エラーになります。
また、ヒアドキュメントを始める識別子(この例では START)は、任意の名前を付
けて構いません。
たとえば「<<< HTML」「<<< TEXT」「<<< EOD」など、自分でわかりやすい名前を使
えます。
終了行(識別子をもう一度書く行)は必ず行の先頭に書き、前後に空白やタブを入れ
ないようにしなければなりません。
ここに空白があると、文字列の終わりを正しく認識できずにエラーになります。
なお、ヒアドキュメントは変数展開({$変数} のように書く)にも対応しており、HTML
の中に動的な値を埋め込みたいときにも便利です。
したがって、選択肢にある
【C】に「>>>START」を記述すると、その直後から「END」の直前までがヒアドキュ
メントとしてprint命令に渡され表示がなされる。
という記述は、誤りです。
正しくは「<<<START」のように「<」を3つ使い、開始と終了の識別子を一致させる
必要があります。
(参考:PHP公式マニュアル「ヒアドキュメント構文」
https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc )
なお、PHPにはヒアドキュメントに似た「Nowdoc(ナウドキュメント)」という書き
方もあります。
こちらは変数を展開せず、すべてを文字列としてそのまま扱う方法です。
興味があれば PHP公式マニュアル「Nowdoc構文」も参照してみましょう。
(参考:PHP公式マニュアル「Nowdoc構文」
https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.nowdoc )
選択肢4を見ていきましょう。
$_SERVERは、PHPが実行されているサーバ環境やリクエストの情報を格納した「スー
パーグローバル変数」です。
スーパーグローバル変数とは、関数の内側でも外側でもどこからでもアクセスできる
特別な変数のことを指します。
$_SERVERには、アクセスしたURLや使用されたHTTPメソッド、スクリプトのパスなど、
サーバやリクエストに関する多くの情報が入っています。
その中の$_SERVER[‘PHP_SELF’]は、「実行中のスクリプト自身のパス」を表します。
たとえば、ブラウザで次のURLにアクセスしている場合を考えると、
https://example.com/form/test.php
このとき$_SERVER[‘PHP_SELF’]の値は次のようになります。
/form/test.php
このように、スキーム(https://)やホスト名(example.com)は含まれず、ドキュ
メントルートからの相対パスが返されます。
したがって、選択肢にある「プロトコルやホスト名を含まないURLが含まれる」とい
う説明は、正しい内容です。
なお、環境やサーバ設定によっては、PATH_INFO が付与された形
(例: /form/test.php/extra/path)のように返る場合があります。
一方、クエリ文字列(?以下)は通常 $_SERVER[‘QUERY_STRING’] に入るため、PHP_SELF
自体には含まれません。
また、設問ではヒアドキュメントの中に$_SERVER[PHP_SELF]が書かれていますが、ヒ
アドキュメントでは変数展開の一部として配列キーをクォートなしで書ける特別な構
文が使えます。
通常のPHPコード中では$_SERVER[‘PHP_SELF’]のようにクォートを付けて書くのが正
しい形式です。
したがって、選択肢にある
【D】行の「$_SERVER[PHP_SELF]」は特別なPHP変数であり、現在のページの、プロト
コルやホスト名を含まないURLが含まれる。
という記述は、正しい説明です。
(参考:PHP公式マニュアル「$_SERVER」
https://www.php.net/manual/ja/reserved.variables.server.php )
選択肢5を見ていきましょう。
設問のコード全体をもう一度整理すると、PHPのヒアドキュメント構文を使って
タグを含むHTMLを出力する内容になっています。
print命令によって、フォーム全体を文字列としてブラウザに送る仕組みです。
フォームの中には「Your Name:」というラベルと、テキスト入力欄(name=”user”)、
そして「Say Hello」というボタンが配置されています。
また、formタグのaction属性には $_SERVER[‘PHP_SELF’] が指定されており、フォー
ムを送信すると、このファイル自身にデータをPOSTする動きになります。
つまり、このプログラムは「ユーザーが名前を入力し、同じページに送信するフォー
ム」を出力しています。
PHP側では、送信されたデータを $_POST[‘user’] で受け取ることができます。
例として、送信後の処理を簡単に加えると次のようになります。
if ($_SERVER[‘REQUEST_METHOD’] === ‘POST’) {
$name = $_POST[‘user’] ?? ”;
print “Hello, ” . htmlspecialchars($name, ENT_QUOTES, ‘UTF-8’);
}
このようにすれば、フォームを表示しつつ、入力された値に応じてメッセージを返す
ことができます。
なお、htmlspecialchars() の第2引数(ENT_QUOTES)は、PHP 8.1以降ではデフォル
トで有効になりましたが、本試験の想定バージョン(PHP 8.0)ではまだ必要です。
したがって、選択肢にある
「このプログラムは、userの値をサブミットするHTMLフォームを出力するものである。」
という記述は、正しい説明です。
模擬試験2では、選択肢3に誤りがあるため、選択肢3が正解になります。
PHP8初級試験と公式問題集に興味がある方は、以下のページをご覧のうえ、この機会に是非受験ください。
PHP8初級試験
https://www.phpexam.jp/summary/novice8
公式問題集:PHP8技術者認定初級試験公式問題集A
Kindle版 https://amzn.asia/d/1bS88y9
ペーパーバック版 https://amzn.asia/d/3P3Izeu
また、試験対策セミナーは毎月開催しています。興味がある方は以下のページをご覧いただき是非セミナーにもご参加ください。(フォローいただけるとセミナーのご案内が届くようになります)
PHP技術者認定機構の公式Peatixグループ
https://peatix.com/group/43424

