問題6~10
問題6|PHP5上級:フィルタに関する出題
以下のコードを実行したときの出力結果として正しいものを1つ選択せよ。
<?php
function filter_test($v) {
var_dump(filter_var($v, FILTER_VALIDATE_INT));
}
//
filter_test(10);
filter_test("10");
filter_test(10.0);
filter_test(10.1);
filter_test("123E+2");
filter_test("0x1a");
-
1.
int(10) int(10) bool(false) bool(false) bool(false) bool(false)
-
2.
int(10) int(10) bool(false) bool(false) int(12300) bool(false)
-
3.
int(10) int(10) int(10) bool(false) bool(false) bool(false)
-
4.
int(10) int(10) bool(false) bool(false) bool(false) int(26)
解答・解説
フィルタ関数のうち、filter_var()関数は「第2引数で指定されたフィルタの型によって、様々なフィルタ処理を行う」関数です。
定数の先頭にFILTER_VALIDATE_と付いているものを「検証フィルタ」といい、問題に出てきたFILTER_VALIDATE_INTは「値が整数であるかどうか」を検証することができます。
値が10または"10"は、いずれも「整数」であるために、int(10)が返ってきます。「整数へのフィルタ」なので、入力が文字列("10")であっても、出力はint型になる点に注意してください。
10.0は、FILTER_VALIDATE_INTでは「10という整数」と見なされるため、falseではなく、int(10)が返ってきます。
10.1は「整数ではない」のでfalseになります。
"123E+2"は「PHP的には正しい数値形式」です。例えば、is_numeric()関数に"123E+2"を与えるとtrueを返します。
しかし、FILTER_VALIDATE_INTは「数字または数値形式の文字列であるかを調べる」のではなく「値が整数であるかどうか」を判定するために[3]、"123E+2"はfalseとなります。
"0x1a"も同様に「数値形式の文字列」ではありますが「整数ではない」ので、falseになります[4]。
したがって、問題文のプログラムの出力は、上から順に、
整数である 整数である 整数である false false false
となるために、3番が正解になります。
〔正解:3〕
注
[3]: この説明はis_numeric()関数のマニュアルにあります。
[4]: ただし、filter_var()関数の第3引数でoptionとしてFILTER_FLAG_ALLOW_HEXを指定した場合、16進数表記として正しいのでfalseにはなりません。
問題7|PHP5上級:JSON/JSONPの出題
json/jsonpについて、誤った記述をしているものを1つ選択せよ。
- 1. jsonはデータ記述言語の1つである。元々「JavaScriptにおける表記法」をベースにしているが、現在では様々なソフトウェアやプログラミング言語間におけるデータの受け渡し等に使われている。
- 2. PHPでjsonまたはjsonpを出力するときは、Content-typeにapplication/jsonを指定する必要がある。
- 3. PHPと異なり、jsonでは配列と連想配列は明確に「異なるもの」として扱われる。そのために、記述方法も異なる。
- 4. jsonで扱えるデータ形式は「数値(整数、浮動小数点数)」「文字列」「真偽値」「配列」「オブジェクト(連想配列)」「null」である。
解答・解説
jsonは、現在あちらこちらで使われている、実務での登場確率の多いデータ記述言語です。
jsonの文字列は「そのままJavaScriptのプログラム」として通用する記述です。そのため、以前は、JavaScript側では「受け取ったjson文字列をeval()で評価することで値を取得する」というようなことも行われていました。セキュリティ的に問題があるので現在は行われていませんが、それくらい、json文字列は「JavaScriptの表記そのものである」といえます。故に、1番は「正しい」記述です。
PHPでは、呼称こそ「配列」「連想配列」といってますが、内部的にはどちらも「連想配列」です[5]。一方、JavaScript(を含む大抵の言語)では、配列と連想配列は厳密に区別されており、表記も、配列は角括弧([])、連想配列(JavaScriptではオブジェクトといいます)は波括弧({})というように異なります。故に、3番も「正しい」記述です。
また、決まり事なので説明は省きますが、4番も「正しい」記述です。
jsonのContent-typeは「application/json」ですが、jsonpは本質的に「jsonの出力」ではなくて「JavaScriptの出力」なので、Content-typeはapplication/jsonではなく「application/javascript」となります。故に、2番が「誤った」記述になります。
なお、IE7のブラウザなどで「application/javascriptがエラーになる」というような状況もあるので、もし実務で「古いブラウザに対応させる必要がある場合」には、少し注意をするとよいでしょう。
〔正解:2〕
注
[5]: PHP7で内部的には差異を付けるという話が出ていますが、あくまで内部的にであって、通常は意識しなくて済むことのほうが多いと思われます。
問題8|PHP5初級:日付と時間の出題
ある時間にプログラムを実行したところ、以下の文字列が出力された。
2015-07-20(Mon) Asia/Tokyo 14:15:16
この文字列が出力可能な正しいコードを1つ選択せよ。
- 1. echo date(‘y-m-d(D) e H:i:s’);
- 2. echo date(‘Y-m-d(D) e H:i:s’);
- 3. echo date(‘y-m-d(l) e H:i:s’);
- 4. echo date(‘Y-m-d(D) e h:i:s’);
解答・解説
date関数は、日付時刻関数の中でも、非常に高い使用頻度を誇る関数です。フォーマットの文字列を理解しておくことは重要なので、しっかりと理解しておきましょう。
年を表すフォーマットはおおよそ「Y」と「y」で、このうちYは「西暦を4桁で表示」、yは「西暦を2桁で表示」します。したがって、この時点で、1番と3番は誤りになります。
月を表すフォーマットは、日本では「m」を使うことが多いと思いますが、時々「n」(mと似ているが、先頭にゼロをつけない)が使われることがあります。また、海外対応などの場合は「F」(英語表記、フルスペル)や「M」(英語表記、3文字の略称)が使われることも多いので、覚えておくとよいでしょう。
日は「d」以外に「j」(dと似ているが、先頭にゼロをつけない)が使われることもあります。
曜日の表記には、「D」または「l」(小文字のエル)が使われることが多いでしょう。「D」は英語3文字表記、「l」は英語フルスペル表記となります。日本語表記のフォーマットは存在しないので、「N」(1(月曜日)から 7(日曜日))または「w」(0(日曜)から6(土曜))を基準に、自力で実装する必要があります。
時間の表記には「H」と「h」の2種類があり、「H」は24時間表記、「h」は12時間表記です。この時点で4番が誤りになるため、正解は1番となります。
なお、12時間表記の場合、「a」または「A」で、am/pmの表記を出せるので、合わせて覚えておくとよいでしょう。「a」はam/pm、「A」はAM/PMと表示されます。
〔正解:2〕
問題9|PHP5準上級:Webに関するテクニックの出題
formなどからの入力に関して、正しい記述がされているものを2つ選択せよ。
- 1. $_REQUESTという変数があり、これは$_GETと$_POSTの内容をまとめたものが入っている。
- 2. checkboxやselect+multipleのような「複数の選択肢」が選択可能な場合、<select multiple="multiple" name="hoge[]"> のように、nameアトリビュート値の最後に[]を付ける必要がある。
- 3. URLパラメータで現在のスクリプトに渡された変数は、$_POSTというスーパーグローバル変数に情報が入る。
- 4. formエレメントでmethodアトリビュートが省略された場合はgetとして扱われるので、$_GETに情報が入る。
解答・解説
formなどからの情報の取得に関する問題です。
formでは通常、明示的にmethodアトリビュートが書かれていることが多いのですが、省略されている場合、あるいはアトリビュート値が「post」(大文字小文字は問わない)以外、の場合、すべてGETメソッドとして扱われるために、PHP側では「$_GET」によって値を受け取ります。故に、4番がまず正解の1つになります。
また、HTML側のmethodアトリビュート値にtypoがあった場合「GETとして扱われる」ので、「postを指定しているはずなのに$_POSTに全く情報が入ってこない」場合、HTML側のtypo(打ち間違い)の可能性を疑ってみるとよいかもしれません。
ブラウザなどからの入力値は、$_POSTと$_GETに入ってきます。また、HTTP cookieの内容が$_COOKIEに入ってきます。$_REQUESTはこれら、つまり「$_POSTと$_GETと$_COOKIE」の値がまとめられたものが入ってきます。選択肢1番は$_COOKIEが抜けているので誤りです。
formからの入力は「methodアトリビュートの値による」のですが、URLにパラメタが付与されている場合、これは「GETメソッドとして扱われる」ので、$_GETに情報が入ってきます。故に3番は誤りです。
他の言語では可能ですが、PHPでは「1つのnameに対して複数の値」を、そのままでは受け取ることができません。そのため、1つのnameで複数の値を受け取りたい場合には、HTML側のnameアトリビュート値の最後に[]を付ける必要があります。故に2番の記述は正しいです。この仕様は「他言語でWebアプリケーションを作ってきた」「PHPでずっと作った後に他言語にいった」人にとって落とし穴になりやすいので、気をつけるとよいでしょう。
問題は「正しいものを2つ選択」なので、正解は2番と4番になります。
〔正解:2と4〕
問題10|PHP5上級:グラフィックの出題
以下は、簡単な「画像を動的に作成する」コードである。関数名の一部を穴埋めして、動くコードを作成したい。選択肢のうち、適切なものを1つ選択せよ。
<?php
// ベースになる画像作成
$img = [(1)](300, 300);
// 塗りつぶし矩形
$color = [(2)]($img, 100, 100, 255);
imagefilledrectangle($img, 50, 50, 100, 100, $color);
// 出力
[(3)]('Content-Type: image/png');
[(4)]($img);
-
1.
[(1)] imagecreatetruecolor
[(2)] createcolor
[(3)] header
[(4)] imagejpeg -
2.
[(1)]imagecreatetruecolor
[(2)]createcolor
[(3)]content-type
[(4)]makepng -
3.
[(1)]imagecreatetruecolor
[(2)]imagecolorallocate
[(3)]header
[(4)]imagepng -
4.
[(1)]imagecreate
[(2)]imagecolorallocate
[(3)]header
[(4)]makejpeg
解答・解説
画像の動的な作成です。まず「ベースになる画像の作成」ですが、imagecreatetruecolor関数を用います。ただ、4番のimagecreate関数も存在しますので、推奨はされていませんが、間違いではありません。
「塗りつぶし矩形」にある [(2)] ですが、左辺の変数名から想像が付くとおり、ここでは「色」をアサインしています。パレットで色を使うためにはimagecolorallocate関数を用いる必要があります。そのため、この時点で1番と2番は誤りだとわかります。createcolor関数という関数は、存在しません。
画像の出力時には、まず「Content-type」の適切な出力が必要になります。HTTP headerの出力は、常にheader関数によって行います。この点でも、2番は誤りです。そもそも、ハイフンが入っている時点で「関数名の命名規約」に違反しています。
最後に、実際に「作成した画像」を出力します。画像の出力には、imagepng、imagejpeg、imagegifなどの関数が用いられます。そのため、2番と4番が誤りとなります。また、出力しているheaderが「PNG用」であるために、1番もまた誤りとなります。
以上から、3番が「適切に動くコード」となります。
〔正解:3〕
注
[6]: 関数名で使用可能な記号はアンダースコアのみです。

