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ブロックでは、以下の流れで処理をします。

  1. switchブロックの式を評価
  2. 1.の値に合致するcase句を実行
  3. 対応する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;
}
//結果:一等賞
switch命令は、等価のif命令よりもパフォーマンスが良いというメリットもあります。if~elseif命令では個々の条件式をそれぞれに評価しますが、switch命令では先頭の式を一度だけしか評価しないためです。

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 => '???'
};