連載
» 2017年05月08日 05時00分 公開

PHPの条件分岐、if、switch&比較演算子の使い方Web業界で働くためのPHP入門(4)(2/3 ページ)

[山口晴広, 齊藤新三(改訂)/山田祥寛(改訂監修),WINGSプロジェクト]

条件が偽のときの処理は「else」で

 これまでの例は、条件が真のときのみ実行するというものでした。もしこの書き方しかないとすると、真のときと偽のときで別々の処理をしたい場合に、次のように書かねばなりません。

if($foo == 123) {
    print("fooの値は123です");
}
if($foo != 123) {
    print("fooの値は123ではありません");
}

 これだと比較を2回行っていて冗長ですし、1個目と2個目のif文が密接につながっているものだということが、ぱっと見てすぐには分かりません。そこで、条件が真ではなかった場合に実行するための文法があります。それが、「else」です。例えば、下記のようになります。

<?php
$foo = 123;
if($foo == 123) {
    print("fooの値は123です<br>");
} else {
    print("fooの値は123ではありません<br>");
}
print("処理終了!");
リスト3 phplesson/chap04/ifElseStatement.php

 このままだと、実行結果はリスト1と同じですが、$fooの値を123以外に変更して実行してみてください。その場合、下記のように表示され、条件が偽の場合も実行されているのが確認できるでしょう。

fooの値は123ではありません
処理終了!

複数の条件で分岐したい場合の「elseif」

 さて、次の例として、正の数か負の数か、あるいは0かの3種類に場合分けする例を考えてみます。if文は「ネスト」(入れ子)にできるので、次のように書くことができます。

<?php
$foo = rand(-10, 10);
if($foo == 0) {
    print("fooの値は0です<br>");
} else {
    if($foo > 0) {
        print("fooは正の数です<br>");
    } else {
        print("fooは負の数です<br>");
    }
}
print("fooの値は{$foo}でした");
リスト4 phplesson/chap04/nestedIfStatement.php

 2行目のrand()は初めて登場する命令ですが、これは乱数を発生させるものです。乱数は、名前の通り、不規則かつ等確率に現れる数字のことです。簡単にいうと、次に何が出るか分からない数字のことです。( )内に2個数字が並んでいますが、これで乱数の範囲を指定します。

 下記のようにすることで、-10〜10の範囲の乱数を発生させます。これを変数$fooに代入しています。

rand(-10, 10)

 リスト4は乱数を使用していますので、実行のたびに結果が変わり、以下の3パターンになります。

fooは正の数です
fooの値は10でした
fooは負の数です
fooの値は-6でした
fooの値は0です
fooの値は0でした

 さて、リスト4のソースコードですが、外側のif文で0かそれ以外かを判定し、さらに0以外のとき(7〜10行目)に「0より大きいかそうでないか」を判定しています。最後に残るのが負のケースなのは明らかなので、比較はしていません。

 このネストを使った書き方でも問題はないのですが、例のような並列な条件の場合、「elseif」を使って次のように書いた方が見やすいでしょう。

<?php
$foo = rand(-10, 10);
if($foo == 0) {
    print("fooの値は0です<br>");
} elseif($foo > 0) {
    print("fooは正の数です<br>");
} else {
    print("fooは負の数です<br>");
}
print("fooの値は{$foo}でした");
リスト5 phplesson/chap04/elseIfStatement.php

 実行結果はリスト4と同じです。

 インデントもそろって、並列な条件分岐であることが見た目にもすぐ分かります。なお、「elseif」とつながっており「else if」ではありません。elseifは幾つでも使えますが、elseより前になければいけません。

 動作をまとめると、まずif文の条件が最初に評価され、真であれば続く波かっこの中身が実行されます。偽でありなおかつelseifがあればその条件が評価され、真であれば実行、偽であれば次のelseif(もしあれば)の条件を評価する、ということを繰り返します。最後に、ifと全てのelseifが偽のとき、elseがあればそれを実行します。

注意! 「if文での波かっこの省略」

 if文で実行する文が1文の場合、波かっこを省略できます。リスト5は次のようにも書けます。

if($foo == 0)
    print("fooの値は0です<br>");
elseif($foo > 0)
    print("fooは正の数です<br>");
else
    print("fooは負の数です<br>");

 しかし、後から文を追加するときに面倒ですし、省略したところでメリットはありません。常に波かっこを入れるようにしましょう。コードを読むとき、こういう書き方に出くわしたときのための知識です。

 ところで、本文中では「else if」ではなく「elseif」であると書きましたが、実際にはどちらでも動作します。「else if」はelseにおいて波かっこを省略したケースになるためです。分かりやすくインデントすると、次のように解釈されるということです。

if($foo == 0) {
    print("fooの値は0です<br>");
} else
    if ($foo > 0) {
        print("fooは正の数です<br>");
    }
    else {
        print("fooは負の数です<br>");
    }

 「else if」と「elseif」、実際にはどちらも使われていますが、PHP標準は「elseif」です。これもコードを読むときの知識として覚えておく程度でいいでしょう。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。