PHP7初級試験 模擬問題 – 出題範囲: ロジック:判定と繰り返し からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!
問題
次の選択肢のなかで、誤っているものはどれでしょう? (1つ選択)
- 整数値
0
、小数値0.0
と、空文字列''
、文字列'0'
は論理型に変換されるとすべてfalse
として判定される if
文で条件を満たさなかった場合には、elseif
文で別の条件を判定することができる。elseif
の別の書き方としてelse if
があるswitch
文は複数の分岐が必要なときに使われる。case
文にswitch
式と同じ値と評価される値を記載し、default
文ですべての条件に合わない場合の条件を記載する。なお、break
文を挿入しないと次のcase
文も処理されるため注意が必要である- 比較演算子には、型を自動変換し比較する緩やかな比較
==
と、型も厳密に比較する===
という違いがある - 繰り返し実行の構文として
foreach
、for
、while
、do-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。 null
と null 文字
は別物なので注意。
・ [false]
: 配列の中に false
のみが含まれる場合。配列に何か含まれる場合は無条件に `true` になるので注意。
・ [0]
, ['']
, [null]
… : 配列の中に false
となる条件のみが含まれる場合。配列に何か含まれる場合は無条件に true
になるので注意。
2. if
文で条件を満たさなかった場合には、 elseif
文で別の条件を判定することができる。 elseif
の別の書き方として else if
がある
選択肢のとおりです。
条件で処理を分岐したい場合 if
文を使用します。 条件にそぐわなかった場合に別処理を行いたい場合は else
を、複数条件を使用したい場合は elseif
もしくは else if
を使用します。 前記のとおり、elseif
の別の書き方として else if
があります。
【試験合格後もステップアップ!】elseif
と else if
では、間にスペースのない elseif
の書き方を推奨します。
PHP のコーディング規約で有名な PSR-12 や WordPress 規約などでも elseif
の記法を推奨しています。elseif
の else 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
文ですが、実は使いにくい部分もあります。
・先述の通り case
に break
文は必須ですが、わざと書かない場合もあります。この場合、他の人が 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. 繰り返し実行の構文として foreach
、 for
、 while
、 do-while
文などがある。繰り返し実行を抜けるために continue
文を使い、無駄な繰り返し実行は行わないようにする
繰り返し実行を抜けるためには continue
文ではなく、 break
文を使います。
continue
文は繰り返し処理中のうち、現在の処理途中で残りの処理をスキップし、条件式を評価した後に次の繰り返し処理を最初から実行するために使用されます。
他は選択肢のとおりです。
繰り返し実行の構文として foreach
、 for
、 while
、 do-while
文などがあります。 また、無駄な繰り返し処理を行わないことは繰り返し処理において重要なことです。
選択肢の内容にはありませんでしたが、繰り返し実行は無限ループ処理に陥ることもありますので、慎重に利用してください。
【試験合格後もステップアップ!】
繰り返し構文を選ぶ際に、どれを選んでよいかわからない場合、参考にしてください。
・必ず 1 回は実行したい場合はdo-while
文がオススメです。繰り返し処理は条件により実行されないこともありますが、do-while
文で書かれていると、最低 1 回は実行したいというニュアンスが伝わります。
・条件に適合するまで繰り返し処理を行いたい場合は、while
文をオススメします。特にwhile
文とdo-while
文は無限ループに陥りやすいので、break
文などを適切に使用して無限ループに陥らないように考慮してください。
・配列などの個数が決まっている場合は、foreach
文をオススメします。ただし、range()
関数を組み合わせて使う際には注意が必要です。range()
関数はイテレータを生成するわけではないため、大きな配列をメモリに展開する恐れがあるためです。
・for
文は他のパターンで簡単に書けそうにないときに使います。for
文の構文は少し特殊で、他のプログラミング言語でもあまり積極的に使われなくなっているためです。
・他にも array_map()
関数や array_walk()
関数などの実質的に繰り返し処理ができるものも用意されています。繰り返し構文以外もケースに応じて検討してみてください。
好みの問題や理解度もあると思いますので、使いやすくわかりやすい構文を使う方針で良いと思います。