DESIGNMAP

  1. TOP
  2. 公開講座
  3. ゼロから始めるPHP入門
  4. 条件分岐 ー ゼロから始めるPHP入門(PHP7)【Vol.7】

条件分岐 ー ゼロから始めるPHP入門(PHP7)【Vol.7】

今回は条件分岐を学んでいきます。PHPではif文、switch文が用意されています。加えて三項演算子とPHP7から加わったnull合体演算子もご紹介します。

Atomを起動して、新規ファイルを作ります。「PHPの実行」で作った[php-study]フォルダ内に「sample7-1.php」として保存します。「PHPの実行」と同じようにHTMLのコードをAtomで生成させて、body要素内に以下のコードを書きます。Apacheを起動して、ChromeからPHPを実行してください。

※PHPの実行方法の詳しい手順は「PHPの実行」をご覧ください。これ以降のコードに関しても任意のファイル名で作成して、実際にPHPを実行しながら読む進めていってください。

<?php
$num = 10;
if ($num % 2 === 0){
  echo "{$num}は偶数です。";
} else {
  echo "{$num}は奇数です。";
}
?>

実行結果:

10は偶数です。

$numの値を「11」に変更して、PHPファイルを保存して、Chromeを再読み込み([表示]メニュー→[ページを再読み込み])すると、「11は奇数です。」に実行結果が変わることを確認してください。

if else 文

if else文は以下のような書式です。

if (条件式) {
    条件式がtrueの時に実行される
} else {
    条件式がfalseの時に実行される
}

{}をブロックといいます。if else文は条件式の結果に応じて、どちらかのブロックのコードが実行されます。

%演算子の回で学びました。割り算の余りを取得できます。===も演算子の回で学びました。両辺のデータ型と値が等しければtrueに置き替わり、そうでなけれなfalseに置き替わります。

偶数は2で割ると、あまりはゼロになります。
つまり条件式の部分は0 === 0という状態になります。===は両辺をみて、trueに置き替わり、条件式はif (true) {になります。

ブロックを使わない別な書式もあります。

if (条件式):
    条件式がtrueの時に実行される
else:
    条件式がfalseの時に実行される
endif;

これはWordPressのテーマファイルなどで見かける書き方です。

入れ子のif文

ifブロックの中に、別なif文を入れることができます。

<?php
$num = 48;
if ($num % 2 == 0){
  if ($num >= 50){
    echo "{$num}は偶数で50以上の数字です。";
  } else {
    echo "{$num}は偶数で50未満の数字です。";
  }
} else {
  echo "{$num}は奇数です。";
}
?>

実行結果:

48は偶数で50未満の数字です。

$num変数の値を変更して結果が変わることを試してみてください。入れ子のif文は読みにくいので、使うときは注意が必要です。せいぜい二重の入れ子までにおさえるようにしてください。三重以上の入れ子になると、コードの可読性は下がります

if elseif 文

<?php
$num = 29;
if ($num < 10){
    echo "{$num}は10未満の数字です。";
} elseif ($num >= 10 && $num < 30) {
    echo "{$num}は10以上30未満の数字です。";
} else {
  echo "{$num}は30以上の数字です。";
}
?>

実行結果:

29は10以上30未満の数字です。

最初の条件式($num < 10)trueであれば、echo "{$num}は10未満の数字です。"が実行され、if文の外側にぬけます。

最初の条件式がfalseの場合、($num >= 10 && $num < 30)の条件式が実行されます。trueであれば、echo "{$num}は10以上30未満の数字です。"が実行されます。falseであれば、echo "{$num}は30以上の数字です。"が実行されます。

if elseif文も、実行されるブロックはひとつだけです。図解にすると下図のようになります。

if elseif 文は、条件式の順番に注意しよう

例えば、2の倍数でTWO、3の倍数でTHREE、2と3共通の倍数でTWOTHREEを出力するようなプログラムをかいてみましょう。

うっかり下記のように書いてしまうと、

<?php
$num = 12;
if ($num % 2 === 0){
  echo "TWO";
} elseif ($num % 3 === 0) {
  echo "THREE";
} elseif ($num % 6 === 0) {
  echo "TWOTHREE";
}
?>

実行結果:

TWO

という意図しない結果になります。12は2と3共通の倍数なので、TWOTHREEを出力したかったのです。ところが、最初の条件式num % 2 === 0で、trueを返してしまうので、if文自体がこれで打ち切りになってしまうのです。実行されるブロックはひとつだけなので注意が必要です。

<?php
$num = 12;
if ($num % 6 === 0) {
  echo "TWOTHREE";
} elseif ($num % 2 === 0){
  echo "TWO";
} elseif ($num % 3 === 0) {
  echo "THREE";
}
?>

実行結果:

TWOTHREE

と書くとうまくいきます。条件式の順番には注意が必要です。else ifが何個も続くようなプログラムを見たらバグが入り込みやすいです。不吉な匂いを感じてください。

switch文

筆者個人はswitch文はまったく使用しませんが、コードを読むために必要なので解説しておきます。

<?php
$fruits = "いちご";

switch ($fruits) {
  case "いちご":
    echo "いちご";
    break;
  case "みかん":
    echo "みかん";
    break;
  default:
    echo "その他のフルーツ";
    break;
}
?>

実行結果:

いちご

switch文は以下のような書式です。

switch (式) {
    case 値1:
        式と値1の値が等しければ実行される
        break;
    case 値2:
        式と値2の値が等しければ実行される
        break;
    default:
    	上記以外の場合
    	break;
}

まず式が実行され、case句と値が等しいときに、case句の次の文が実行されます。どれも等しくないときに、default句が実行されます。

caseは何個でも設定できます。

注意しないといけないのは、breakの記述です。if文のときは、ブロックのどれかが実行されると、if文の外側にぬけました。つまり一つだけのブロックだけが実行されました。switch文は自動でぬけません。

下記のように書いてしまうと、

<?php
$fruits = "いちご";

switch ($fruits) {
  case "いちご":
    echo "いちご";
  case "みかん":
    echo "みかん";
  default:
    echo "その他のフルーツ";
}
?>

実行結果:

いちごみかんその他のフルーツ

とすべてのcase句の文が実行されていまします。breakは、if文の外側にぬける役割を果たします。

一部のbreakをいれないswitch文

プログラムによってはわざと一部のbreakをいれない場合もあります。

<?php
$item = "いちご";

switch ($item) {
  case "いちご":
  case "みかん":
  case "ぶどう":
    echo "フルーツです。";
    break;
  default:
    echo "その他のアイテムです。";
    break;
}
?>

実行結果:

フルーツです。

switch文の暗黙の型変換に注意

PHPのswitch文は暗黙の型変換があるため注意が必要です。

<?php
$fruits = "いちご";

switch ($fruits) {
  case 0:
    echo "???";
    break;
  case "いちご":
    echo "いちご";
    break;
  default:
    echo "その他のフルーツ";
    break;
}
?>

実行結果:

???

意図しない結果になります。case 0:の時に、$fruits変数の値を整数型に型変換して値が等しいかをチェックしてしまいます。いちごという文字列が、0に変換されてしまうのです。

三項演算子

三項演算子は条件演算子とも言われます。一行でif else文を書くことができます。

<?php
$num = 40;
$str = ($num > 50) ? "50より大きい" : "50より小さい";
echo $str;
?>

実行結果:

50より小さい
(条件式) ? 式1 : 式2

という書式で条件式がtrueの場合、式1が実行され、falseを返す時に、式2が実行されます。三項演算子の使用は賛否両論があります。筆者はまったく使用しません。ただ実際のコードで出てくるので、コードを読むための知識として紹介しました。

null合体演算子

null合体演算子はPHP7から登場した演算子です。

<?php
$name = "太郎";
$name = $name ?? "名前がありません";
echo $name;
?>

実行結果:

太郎
<?php
$name = null;
$name = $name ?? "名前がありません";
echo $name;
?>

実行結果:

名前がありません
変数 = 式1 ?? 式2

という書式で式1の値がnullでなければ、式1の値が変数に代入され、nullであれば式2の値が変数に代入されます。

null合体演算子はHTMLのフォームのデータから値を受ける時に便利です。従来のisset関数とif文で書いていたコードが簡潔に書けるようになりました。後の回で学びましょう。

スポンサーリンク

プロフィール

DESIGNMAP
ディレクター
ON VISITINGを制作・運営。
お問い合わせ