SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

直近開催のイベントはこちら!

HRzine Day 2024 Winter

2024年2月1日(木)12:00~17:40

主要製品スペック一覧

人事業務の効率・確度・精度を高めるために欠かせないHRテクノロジー。その主な製品の機能を分野ごとに比較できる資料群です。製品検討の参考資料としてご活用ください。

人事労務管理システム<br>主要製品スペック一覧 2023

人事労務管理システム
主要製品スペック一覧 2023

その他のスペック一覧

タレントマネジメントシステム<br>主要製品スペック一覧 2023

タレントマネジメントシステム
主要製品スペック一覧 2023

採用管理システム<br>主要製品スペック一覧 2023

採用管理システム
主要製品スペック一覧 2023

古庄親方のいきなり! PHP技術者認定試験 模擬試験 | 第1回

【PHP技術者】関数の命名規則、適切な出力文字エスケープ関数、フィルタ関数の動作ほか


  • Facebook
  • Twitter
  • Pocket
  • note
  • hatena

問題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-typeapplication/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番になります。

〔正解:24

問題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番は誤りです。そもそも、ハイフンが入っている時点で「関数名の命名規約」に違反しています。

最後に、実際に「作成した画像」を出力します。画像の出力には、imagepngimagejpegimagegifなどの関数が用いられます。そのため、2番と4番が誤りとなります。また、出力しているheaderが「PNG用」であるために、1番もまた誤りとなります。

以上から、3番が「適切に動くコード」となります。

〔正解:3

[6]: 関数名で使用可能な記号はアンダースコアのみです。

この記事は参考になりましたか?

  • Facebook
  • Twitter
  • Pocket
  • note
  • hatena
この記事の著者

古庄 道明(寺子屋/格子組)(フルショウ ミチアキ)

1970年浅草生まれ 1995年に富士通系のソフトハウスに就職しプログラマに転身。1999年個人事業主として独立し現在に至る。「寺子屋」「格子組」といったエンジニア支援活動を独自に展開し、占い師時代の「ガルーダ」という占い師名にちなんだ「がる先生」の愛称で親しまれている。 コンサルティングからシステ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事をシェア

  • Facebook
  • Twitter
  • Pocket
  • note
  • hatena
HRzine
https://hrzine.jp/article/detail/12 2016/01/08 23:03

Special Contents

AD

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

2024年2月1日(木)12:00~17:40

イベントカレンダーを見る

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング