[模擬問題] PHP7初級 – ロジック:判定と繰り返し(エバンジェリスト三雲勇二からの出題)

PHP7初級試験 模擬問題 – 出題範囲: ロジック:判定と繰り返し からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!

目次

問題

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

  1. 整数値 0、小数値 0.0 と、空文字列 ''、文字列 '0' は論理型に変換されるとすべて false として判定される
  2. if 文で条件を満たさなかった場合には、 elseif 文で別の条件を判定することができる。 elseif の別の書き方として else if がある
  3. switch 文は複数の分岐が必要なときに使われる。 case 文に switch 式と同じ値と評価される値を記載し、 default 文ですべての条件に合わない場合の条件を記載する。なお、 break 文を挿入しないと次の case 文も処理されるため注意が必要である
  4. 比較演算子には、型を自動変換し比較する緩やかな比較 == と、型も厳密に比較する === という違いがある
  5. 繰り返し実行の構文として foreachforwhiledo-while 文などがある。繰り返し実行を抜けるために continue 文を使い、無駄な繰り返し実行は行わないようにする

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





























解答

正解は 5. です。

解説

1. 整数値 0、小数値 0.0、空文字列 ''、文字列 '0' は論理型に変換されるとすべて false として判定される

選択肢のとおりです。

if 文でよくハマるポイントとして、変数の中身がどのような条件のときに true となるのか、 false となるのかを把握しておく事が重要です。 false となるケースのほうが少ないので、こちらを把握しておくことが便利です。 選択肢のものを含めまとめましたので、改めて確認してください。

  • 論理型: false
  • 整数: 0, -0。特に -0 のケースを忘れがちなので注意。
  • 小数: 0.0, -0.0。特に -0.0 のケースが忘れがちなので注意。
  • 文字列: 空文字列 '' 、0という文字 '0'。特に '0' という文字列のケースが忘れがちなので注意。
  • 配列: 要素の数がゼロである配列 []
  • null
  • 宣言されていない変数や初期化されていない変数、いわゆる Undefined variable
  • 属性がない空要素から作成された SimpleXML オブジェクト

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

よく間違ったり忘れやすいケースで true になるものとして、下記のものがあります。
このケースはドキュメントに記載されておらず、PHP に詳しい方でも混乱しやすいので注意です。

NAN : 無効な数値。
INF, -INF : 正の無限大および負の無限大。
'-0', '0.0', '-0.0' : -0、0.0、-0.0 という文字列。文字列の 0 と数値の 0 のケースを混同しないように注意。
'00', '000'… : 0が2文字以上続く文字列。数値に変換したときに 0 になるからと勘違いしないように注意。
'0a', '0b'… : 0の後ろに数字以外が続く文字列。
"\0" : ASCII 文字テーブル NUL。 nullnull 文字 は別物なので注意。
[false] : 配列の中に false のみが含まれる場合。配列に何か含まれる場合は無条件に `true` になるので注意。
[0], [''], [null] … : 配列の中に false となる条件のみが含まれる場合。配列に何か含まれる場合は無条件に true になるので注意。

2. if 文で条件を満たさなかった場合には、 elseif 文で別の条件を判定することができる。 elseif の別の書き方として else if がある

選択肢のとおりです。

条件で処理を分岐したい場合 if 文を使用します。 条件にそぐわなかった場合に別処理を行いたい場合は else を、複数条件を使用したい場合は elseif もしくは else if を使用します。 前記のとおり、elseif の別の書き方として else if があります。

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

elseifelse if では、間にスペースのない elseif の書き方を推奨します。
PHP のコーディング規約で有名な PSR-12 や WordPress 規約などでも elseif の記法を推奨しています。
elseifelse if の大きな違いとして、 elseif でのみ条件分岐が記載できるブロック記法というものが存在します。
ブロック記法では、 <?php if ($exp1): ?><?php elseif ($exp2): ?><?php endif; ?> のように書くことができます。シンプルに出力を制御するのに便利な構文です。

3. switch 文は複数の分岐が必要なときに使われる。 case 文に switch 式と同じ値と評価される値を記載し、 default 文ですべての条件に合わない場合の条件を記載する。なお、 break 文を挿入しないと次の case 文も処理されるため注意が必要である

選択肢のとおりです。

if 文で複数の分岐を記載すると elseif 文をたくさん記述することになります。 その場合に使われるのが switch 文です。

switch 文では case 文に値を記載していきます。複数の case 文を記載することも可能ですし、すべての case 文に当てはまらない場合は default 文を記載すれば分岐できます。

case 文は break 文を書かない限り、次の case 文も続けて実行されることに注意してください。

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

便利な switch 文ですが、実は使いにくい部分もあります。

・先述の通り casebreak 文は必須ですが、わざと書かない場合もあります。この場合、他の人が break 文の記載漏れと勘違いしないよう、 // no break とコメントを代わりに記載することをオススメします。これは PSR-12 や WordPress コーディング規約でも推奨されています。
switch 文の比較は、型を考慮しない緩やかな比較となります。緩やかな比較はバグが発生しやすいので注意してください。
・PHP の仕様として、switch 文内に書かれた continue 文が break 文と同じ動作をします。while 分や foreach 文などの中に書かれた switch 文で、繰り返し処理の制御のために continue を使用したい場合は、 continue 2 など抜けるブロック数を記載する必要があります。

PHP 8.0 では新たに match 式が導入されました。
PHP 8.0 以降では switch 文よりも match 式を使用することを検討してみてください。

4. 比較演算子には、型を自動変換し比較する緩やかな比較 == と、型も厳密に比較する === という違いがある

選択肢のとおりです。

PHP では型、特に変数や引数で型を意識することなくコードを書くことができます。
整数の 1234 と文字の '1234' があったとき、これが同じと判定するのが緩やかな比較で、数字と文字はそもそも違う (型が違う) ということで違うと判定するのが厳密な比較です。

例えば引数を整数型に限定しておくと、文字列を入れた場合はもちろん、小数を入れてしまった場合にもバグとして早めに気づくことが可能です。

型という概念はなかなか初心者が難しいですが、バグを産まないために非常に重要な概念です。
比較するときにはできうる限り、厳密な比較を使用することをオススメします。

厳密な比較演算子には ===, !== があります。

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

型はあくまでも制限をくわえて早めにバグを見つけ出す最低限の手法で、万能ではありません。
入力されたデータの型だけでなく値の範囲やサニタイジングを意識することも重要です。

型を使用するもう一つの理由に、無駄にメモリや記憶容量を使用しないというメリットもあります。

PHP 8.0 以降では緩やかな比較に大きな変更があります。
PHP 7.4 以前で緩やかな比較をする際には、文字列が数値または数値形式の文字列の場合、文字列は比較する前に数値に変換されていました。

5. 繰り返し実行の構文として foreachforwhiledo-while 文などがある。繰り返し実行を抜けるために continue 文を使い、無駄な繰り返し実行は行わないようにする

繰り返し実行を抜けるためには continue 文ではなく、 break 文を使います。

continue 文は繰り返し処理中のうち、現在の処理途中で残りの処理をスキップし、条件式を評価した後に次の繰り返し処理を最初から実行するために使用されます。

他は選択肢のとおりです。

繰り返し実行の構文として foreachforwhiledo-while 文などがあります。 また、無駄な繰り返し処理を行わないことは繰り返し処理において重要なことです。

選択肢の内容にはありませんでしたが、繰り返し実行は無限ループ処理に陥ることもありますので、慎重に利用してください。

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

繰り返し構文を選ぶ際に、どれを選んでよいかわからない場合、参考にしてください。

・必ず 1 回は実行したい場合はdo-while文がオススメです。繰り返し処理は条件により実行されないこともありますが、do-while文で書かれていると、最低 1 回は実行したいというニュアンスが伝わります。
・条件に適合するまで繰り返し処理を行いたい場合は、while文をオススメします。特にwhile文とdo-while文は無限ループに陥りやすいので、break文などを適切に使用して無限ループに陥らないように考慮してください。
・配列などの個数が決まっている場合は、foreach文をオススメします。ただし、range()関数を組み合わせて使う際には注意が必要です。range()関数はイテレータを生成するわけではないため、大きな配列をメモリに展開する恐れがあるためです。
for文は他のパターンで簡単に書けそうにないときに使います。for文の構文は少し特殊で、他のプログラミング言語でもあまり積極的に使われなくなっているためです。
・他にも array_map()関数や array_walk() 関数などの実質的に繰り返し処理ができるものも用意されています。繰り返し構文以外もケースに応じて検討してみてください。

好みの問題や理解度もあると思いますので、使いやすくわかりやすい構文を使う方針で良いと思います。

試験の情報

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

模擬問題作成及び解説

三雲 勇二
プライム・ストラテジー株式会社 所属。PHP8上級(ベータ試験) / PHP5上級 / 徳丸実務試験(ベータ試験) などの多数の試験に合格。ペチゾーをデスク周りにおいて日々お仕事しています。
Facebook: facebook.com/yuji.mikumo
Twitter: @maikeru

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

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