
PHP8 上級/準上級試験の認定模擬問題として、プライム・ストラテジー様のPRIME STUDYが認定されているようです。ただ、この模擬問題には解説がありませんので解説をまとめていこうと思います。シリーズ第16回目です。

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。

今回は制御構造に関する問題です。break や continue の使い方、特にネストされたループでの挙動や、PHP 7.3 以降での switch 内での continue の使用に関する警告など細かな仕様の理解が求められます。しっかりと押さえていきましょう。
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
制御構造に関する説明の中で、誤っているものを1つ選びなさい。
なお、すべてのコードの先頭には下記のコードが書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
(1)
PHP の制御構造 (if, while, for, foreach, switch) では、波括弧 {} の変わりに「開き波括弧をコロン(:)、閉じ波括弧をそれぞれ endif;, endwhile;, endfor;, endforeach;, endswitch; に変更する」事が出来る。そのため、以下のコード
<?php
$i = 10;
if ($i > 9) : ?>
$i は9より大きい
$i は9以下
を実行すると、結果は次のとおりとなる。
$i は9より大きい
(2)
break は、現在実行中の for, foreach, while, do-while, switch 構造の実行を終了する。そのため、以下のコード
for($i = 0; $i < 10; ++$i) {
echo "{$i}¥n";
break;
}
を実行すると、結果は次のとおりとなる。
0
(3)
break は、現在実行中の for, foreach, while, do-while, switch 構造の実行を終了する。
また、break ではオプションの引数でネストしたループ構造を抜ける数を指定することができる。
いくつかネストしているループの内側で「その全てのループを抜け出したい」場合、大きな値をとりあえず入れておくとよい。そのため、以下のコード
$i = $j = 0;
while($i < 10) {
echo "i is {$i}", PHP_EOL;
$i ++;
while($j < 10) {
echo "j is {$j}", PHP_EOL;
$j ++;
break 999;
}
}
を実行すると、結果は次のとおりとなる。
i is 0
j is 0
(4)
continue は、ループ構造 (for, foreach, while, do-while) において現在の繰り返しループ の残りの処理をスキップし、条件式を評価した後に 次の繰り返しの最初から実行を続けるために使用される。
PHP 7.3 以降、switch 内部で break 文のように振る舞おうとする continue については、E_WARNING をトリガーするようになった。そのため、以下のコード
$i = 2;
switch($i) {
case 0:
case 1:
echo "i is {$i}", PHP_EOL;
continue;
default:
echo "i is {$i}: final", PHP_EOL;
continue;
}
PHP 7.2 までであれば、結果は次のとおりとなる。
i is 2: final
PHP 7.3 以降は、結果は次のとおりとなる。
Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in ….
解説
選択肢1の解説
正しいです。
PHP の制御構造では、波括弧 {} の代わりにコロン : と endif; などの構文を使うことができます。この記法は、HTML と PHP を混ぜて記述する際によく使われます。
選択肢2の解説
正しいです。
break はループや switch の実行を終了させます。このコードでは、break が最初のループを抜けるため、出力は 0 のみになります。
選択肢3の解説
誤りです。
break において、大きな値(999)を指定する必要はなく、適切なループ数(通常は 1 や 2)を指定することが望ましいです。
選択肢4の解説
正しいです。
continue は現在のループの残りの処理をスキップして次の繰り返しから実行を再開します。PHP 7.3 以降では、switch 内で continue を使うと警告が出るようになり、continue 2 として switch を抜ける動作を明示する必要があります。
正解選択肢
以上より選択肢3が正解となります。
他の問題へ
模擬問題(1)インストール
模擬問題(2)変数の型
模擬問題(3)クラス
模擬問題(4)メソッドその1
模擬問題(5)メソッドその2
模擬問題(6)リファレンス
模擬問題(7)名前空間
模擬問題(8)エラー
模擬問題(9)定義済みのインターフェイスとクラスおよび SPL インターフェイス
模擬問題(10)SPL
模擬問題(11)定義済の変数
模擬問題(12)PHP7.0.xからPHP7.1.xへの移行
模擬問題(13)可変変数
模擬問題(14)PHP7.3.xからPHP7.4.xへの移行
模擬問題(15)PHP7.4.xからPHP8.0.xへの移行
模擬問題(16)制御構造
模擬問題(17)XSS(クロスサイトスクリプティング)
模擬問題(18)ファイルアップロード
模擬問題(19)推測困難なトークン
模擬問題(20)セッション
模擬問題(21)PHP のメモリ消費
模擬問題(22)関数その1
模擬問題(23)関数その2
模擬問題(24)関数その3
模擬問題(25)関数その4
模擬問題(26)関数その5
模擬問題(27)関数その6
模擬問題(28)関数その7
模擬問題(29)関数その8
模擬問題(30)関数その9
コメント