PHP入門 条件分岐
条件分岐構文に属するif命令とswitch/match命令について解説しています。
if命令(単純分岐)
if命令は、与えらえた条件がtrue/falseのいずれかであるかによって、実行すべき処理を分岐する命令です。elseブロックを省略することもできます。
構文:if命令
if(条件式){
//条件式がtrueである場合に実行する処理
}else{
//条件式がfalseである場合に実行する処理
}
<?php
$x = 10;
if($x === 10){
print '変数$xは10です。';
}else{
print '変数$xは10ではありません。';
}
条件演算子での分岐方法
print $x === 10 ? '変数$xは10です' : '変数$xは10ではありません。';
if命令(多岐分岐)
elseifブロックを利用することで多岐分岐を表現できます。elseifブロックは、必要な分岐の数だけ列挙ができます。複数の条件に合致した場合でも、実行されるのは最初にマッチした条件のブロックだけです。
構文:if~elseif命令
if(条件式1){
//条件式1がtrueである場合に実行する処理
}elseif(){
//条件式2がtrueである場合に実行する処理
}
・・・・
}else{
//条件式1、2・・・がいずれもfalseである場合に実行する処理
}
if命令(入れ子構造)
if命令は、お互いに入れ子にすることもできます。制御命令同士を入れ子に記述することをネストすると言います。switch、for/foreach、while/do~whileなどもネスト可能です。
<?php
$x = 1;
$y = 0;
if ( $ === 1 ){
if( $y === 1 ){
print '変数$x、$yは1です。';
}else{
print '変数$xは1ですが、$yは1ではありません。';
}
}else{
print '変数$xは1ではありません。'
}
//結果:変数$xは1ですが、$yは1ではありません。
中カッコは省略可能
if命令の配下の命令文が1つだけある場合、ブロックを表す中カッコ({~})は省略できます。
<?php
$x = 10;
if ( $x === 10 )
print '変数$xは10です。';
else
print '変数$xは10ではありません。';
条件式を指定する場合の注意点
1、bool型の変数を「==」「===」で比較しない
if($flag == true)
以下とする
if($flag)
if(!$flag)
2、falsyな値に注意
falsyな値(暗黙的にfalseとみなされる値)。条件式の文脈では非bool値も暗黙的にbool値に変換されます。条件式の文脈では非bool値も暗黙的にbool値に変換されます。たとえば、$numの値がfalse、ゼロ値いずれにもなりうる場合、「if($num)~」はいずれもfalseとなります。この場合、$numがfalseであることを判定するには、「if($num === false)~」のように、厳密な等価演算子を使ってfalseを判定します。
3、条件式からはできるだけ否定を取り除く
否定+論理演算子の組み合わせは、一般的にわりづらいのでできるだけ肯定表現に置き換えます。
//$flag1、2がともにtrueでない場合
if (!$flag1 && !$flag2){・・・}
以下のように置き換えます
if(!($flag1 || $flag2)){・・・}
もしくは
if ($flag1 || $flag2){
;空文
}else{
任意の処理
}
switch命令(多岐分岐)
switch命令は「等価演算子による多岐分岐」に特化した条件分岐命令です。switchブロックでは、以下の流れで処理をします。
- switchブロックの式を評価
- 1.の値に合致するcase句を実行
- 対応するcase句が見つからない場合には、default句を実行
switch命令に、breack命令は必須となります。ただし、breack命令は省略することでcase句を続けて実行することもできます(フォールスルー)が、一般的に使用することはありません。
判定方法について
switch命令は、式と値を「===」演算子ではなく「==」演算子で比較するため、データ型については比較対象とならない点に注意が必要です。
構文:switch命令
switch(式){
case 値1:
//「式 == 値1」である場合に実行する処理
case 値1:
//「式 == 値2」である場合に実行する処理
・
・
・
default:
//式が値1及び値2のいずれでもない場合に実行する処理
}
<?php
$rank = '1';
switch ($rank){
case '1':
print '一等賞';
break;
case '2':
print '二等賞';
break;
case '3':
print '三等賞';
break;
default:
break;
}
//結果:一等賞
match式
PHP8では、値を返せるswitchとしてmatch式が導入されました。値を返せるとは、たとえばmatch式の結果を変数に代入したり、引数として渡せるということです。default句は省略することができますが、すべての値にマッチしない場合は、「UnhandledMatchError」が発生します。
match式は「===」演算子で比較します。また、match式はbreakは暗黙的に付与されるため、意図しないフォールスルーによるバグの心配はありません。
構文:match式
match(式){
値1 => 式1,
値2 => 式2,
・
・
・
default => 式N
}
<?php
$rank = '1';
$result = match($rank){
'1' => '一等賞',
'2' => '二等賞',
'3' => '三等賞',
default => '???'
};
print $result; //結果:一等賞
「=>」の右辺には単一の式
「=>」の右辺に複数の式(文)を書くことはできません。複数の文を伴うような多岐分岐であれば、これまで通り、switch命令を使用します。もしくはユーザー関数を使用します。
'100' => processid(),
「=>」の左辺には任意の式を指定できる
関数/メソッドによる呼び出しも可能です。上から順に式が評価され、その戻り値が最初に一致したものが採用されます。
<?php
$rank = '1';
$result = match($rank){
yamada() => '一等賞',
hanako() => '二等賞',
kudo() => '三等賞',
default => '???'
};