問題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]: 関数名で使用可能な記号はアンダースコアのみです。