if文と論理演算子
- 解説
- 1. 条件分岐とif文
- 2. else文
- 3. else-if文
- 4. 並列と入れ子
- 5. 論理演算子
解説
1. 条件分岐とif文
条件分岐とは、既にこれまでの学習でも見てきたように、「もし~ならば」という条件文によってその後の処理を枝分かれさせることです。この枝分かれを実現するのがif文(イフ文)という構文です。「if」は英語で「もしも」のことです。
次のサンプルコードはif文の最も単純な形です。キーワード「if」に続く丸括弧の中がtrueである場合のみ、丸括弧に続くブロックの中身が実行されます。
static function practiceIf() {
if (true) {
Logger::echo('ifに続く丸括弧内がtrueだから実行された!');
}
}
この丸括弧内に論理値型の変数や、論理値型の結果を返す条件式・メソッド呼出を入れることで、その条件に応じて処理を切り替えられます。次のサンプルコードの条件をいろいろ書き換えてみて、ブロック内の実行を制御できることを確認しておきましょう。
static function practiceIf() {
// if (false) {
// Logger::echo('ifに続く丸括弧内がtrueだから実行された!');
// }
$calculationResult = 1 + 2;
$condition = ($calculationResult < 4);
if ($condition) {
Logger::echo('論理値型変数の中身がtrueだから実行された!');
}
if ($calculationResult < 4) {
Logger::echo('条件式の評価結果がtrueだから実行された!');
}
if (is_int($calculationResult)) {
Logger::echo('メソッドの戻り値がtrueだから実行された!');
}
}
2. else文
if文では「ある条件を満たす場合に実行する」ブロックを作成することができましたが、「それ以外の場合に実行する」ブロックを作成するには、else文を使用します。
次のサンプルコードのように、if文のブロックに続けてキーワード「else」とブロックを書くことで、if文に続く丸括弧内がfalseだった場合の処理を書くことが可能です。
static function practiceElse() {
$condition = false;
if ($condition) {
Logger::echo('条件はtrue!');
} else {
Logger::echo('条件はtrueではない!');
}
}
3. else-if文
分岐させたい条件が複数ある場合には、else-if文を使用することが可能です。
次のサンプルコードのように、if文のブロックに続けてキーワード「else」を書き、さらに、続けてif文を書くことで条件を増やすことができます。このelse-if文はいくつでも繋ぐことが可能ですが、上から順番に丸括弧内の条件式の評価が行われ、trueとなったブロックを実行したらそれ以降を無視して終了(if文・else-if文・else文の次の行に移る)となります。
なお、else文はif文・else-if文全体に対してひとつのみ書くことができ、「どの条件式のブロックにも入らなかった場合」に実行されるブロックとなります。
static function practiceElseIf() {
$conditionA = false;
$conditionB = true;
$conditionC = true;
if ($conditionA) {
Logger::echo('$conditionAがtrueだから実行された!');
} else if ($conditionB) {
Logger::echo('$conditionBがtrueだから実行された!');
} else if ($conditionC) {
Logger::echo('$conditionCがtrueだから実行された!');
} else {
Logger::echo('$conditionA~Cがすべてfalseだから実行された!');
}
}
[2020/12/31 12:34:56] conditionBがtrueだから実行された!
// conditionCもtrueだが、先に7行目が評価され8行目が実行されたためそこで終了
4. 並列と入れ子
前項のサンプルコードのelse-if文をただのif文3つにしてみましょう。
static function practiceFlatten() {
$conditionA = false;
$conditionB = true;
$conditionC = true;
if ($conditionA) {
Logger::echo('$conditionAがtrueだから実行された!');
}
if ($conditionB) {
Logger::echo('$conditionBがtrueだから実行された!');
}
if ($conditionC) {
Logger::echo('$conditionCがtrueだから実行された!');
}
}
すると、今度は12行目も実行されましたね。では次に、else-if文を使わず、else文を使って、前項と同じ処理結果となるように組み直してみます。
static function practiceNest() {
$conditionA = false;
$conditionB = true;
$conditionC = true;
if ($conditionA) {
Logger::echo('$conditionAがtrueだから実行された!');
} else {
if ($conditionB) {
Logger::echo('$conditionBがtrueだから実行された!');
} else {
if ($conditionC) {
Logger::echo('$conditionCがtrueだから実行された!');
} else {
Logger::echo('$conditionA~Cがすべてfalseだから実行された!');
}
}
}
}
このようにif文は、並列にするのか、入れ子にするのか、else-if文によって繋げるのかによって、結果も読みやすさも大きく変わりますので、複雑にならないように注意が必要です。
5. 論理演算子
これまでに出てきた条件式には、比較演算式がひとつしかありませんでした。これでは複雑な条件分岐をすべてif文の組み合わせで表現しなくてはなりませんので、比較演算式を組み合わせる方法を学習しましょう。
比較演算式は評価されると結局は論理値となりますので、論理値の状態から新たな論理値の状態を導き出す、論理演算子を使って結果を組み合わせます。
論理演算子 | 用例 | 評価結果 |
---|---|---|
&& | A && B | AとBが両方ともtrueの場合にのみ true A かつ B /論理積/And(アンド)と読む |
|| | A || B | AとBのどちらかがtrueの場合に true A または B /論理和/Or(オア)と読む |
! | !A !(A && B) | trueをfalseに、falseをtrueに反転させる Not(ノット)/論理否定と読む |
実際に必要になるまではピンと来ないと思いますが、次のサンプルコードを確認して、使い方をイメージしておきましょう。
static function practiceComplex() {
$weekday = '火曜';
$isHoliday = true;
if ($weekday === '土曜' || $weekday === '日曜') {
Logger::echo('土曜と日曜は22時まで営業!');
} else if ($weekday === '火曜' && $isHoliday) {
Logger::echo('火曜でも祝日は営業!');
} else if ($weekday === '火曜' && !$isHoliday) {
Logger::echo('祝日でない火曜は定休日');
} else {
Logger::echo('通常は21時まで営業中');
}
}
[2020/12/31 12:34:56] 火曜でも祝日は営業!
問題
確認問題
確認問題
次のコードを実行したとき、変数aの値が最終的に2となる
A, B, Cの組み合わせはどれか?
$A = ?;
$B = ?;
$C = ?;
$a = 0;
if ($A && $B) {
$a += 1;
} else if ($B && $C) {
$a += 2;
} else if (!($A || $C)) {
$a += 3;
} else {
$a += 4;
}
Logger::echo($a);