#近況報告
エンジニア転職成功しました。YouTubeでエンジニア転職したい方向けに情報発信しています。
便利な書き方を知ればすぐに使いたくなりますが、用法を正しく守らないと予期せぬ挙動を行なってしまう可能性あり。
今回は、条件分岐をネスト構造で書く際、
ブロック(if ~ elseで使われる波括弧{}のこと)を省略すると戻り値が変わるパターンについてまとめます。
##if文のブロックは省略できる
分岐処理を書く場合のif 〜 elseは定番ですが、
結果処理{}は省略できます。
例えば、以下のように書いても分岐は正しく処理されます。
$x = 10;
if($x === 10)
print '$変数xは10です';
else
print '$変数xは10ではありません';
// 結果 $xは10です
##ネストされたif文の場合
では、ネストされたif文でブロックを外すとどうなるでしょう?
試しに、下記のように書いてみます
$x = 10;
$y = 5;
if($x === 10)
if($y > 10) //ifのネスト
print '変数$xが10かつ変数$yは10より大きい数値です';
else
print '変数$xは10ではありません';
//結果 変数$xは10ではありません
上記では$xは10、$yは5なので、$x === 10はtrueとなるも$yは10より大きくない為、falseとなり、$y > 10のfalseの結果は何も表示されないことを期待していますが、なぜか「変数$xは10ではありません」という結果が出力されています。
その理由として、
分岐処理でブロック{}を外すと、elseブロックは直近のif命令に対応するとみなされることが挙げられます。
試しに、上記の分岐処理にブロックを加えてみましょう。
$x = 10;
$y = 5;
if($x === 10){
if($y > 10){ //ifのネスト
print '変数$xが10かつ変数$yは10より大きい数値です';
}
}else{
print '変数$xは10ではありません';
}
//結果 何も表示されない
何も表示されないことが確認できました。
つまり、「$x === 10」はtrueだが、$yは10より大きくない為falseとなり、「$y > 10」がfalseの時の結果処理はない為、何も表示されない、という事になります。
##if文のブロック{}はどんな条件の場合に省略してよい?
結論は**「if 〜 else」がネスト構造になってない場合のみ省略可能です。**
ネストされていると、elseは直近のifに対応する為、{}を省略した場合は意図しない動作をする可能性があるので要注意です。