if (condition) { ... }は、条件がtrueのときだけブロックを実行します。ほかのケースにはelseif (other condition) { ... }を、残りすべてにはelse { ... }を追加します。PHPは上から条件を調べ、最初に当てはまったブロックだけを実行します。
$temperatureを変えてもう一度実行してみてください。上から順に調べるので、24は2つ目の条件で止まり、>= 10もtrueなのにそこまでは進みません。条件は、限定的なものから一般的なものへの順に並べましょう。
elseifとelse ifの違い
波括弧を使う場合、elseifとelse ifは同じことをします。else ifは厳密には本体が新しいifであるelseですが、結果は同じです。
違いが出るのは、テンプレートで使うコロン構文(次の節以降)だけです。そこではelse ifがコードを壊します。
<?php $score = 72; ?>
<?php if ($score >= 90): ?>
<p>A</p>
<?php else if ($score >= 60): ?>
<p>Passed</p>
<?php endif; ?>
PHP Parse error: syntax error, unexpected token "if", expecting ":" in /home/index.php on line 4
elseifと1語で書けば、このエラーに出会うことはありません。
&&と||で複数の条件
&&(かつ)は両辺がtrueであることを、||(または)は少なくとも一方を必要とし、!は条件を反転します。PHPは答えがわかった時点で評価をやめるので、$user !== null && $user['active']では、ユーザーがいるときだけ2つ目の部分が実行されます。
&&と||を混ぜるときは括弧を付けましょう。&&のほうが強く結びつきますが、括弧があれば次に読む人にも意図が明らかになります。PHPにはandとorというキーワードもありますが、=より優先順位が低いので、$ok = true and false;は$okをtrueにします。&&と||を使いましょう。
ifでtrueとみなされるもの
条件はboolでなくてもかまいません。PHPが変換し、ごく一部の値がfalseとみなされます:false、0、0.0、""、"0"、[]、null。それ以外はすべてtrueで、"false"、" "、"0.0"もtrueです。
| $x | bool | empty |
|---|---|---|
| false | ||
| 0 | ||
| 0.0 | ||
| "" | ||
| "0" | ||
| null | ||
| [] | ||
| " " | ||
| "0.0" | ||
| "a" | ||
| [0] | ||
| 1 |
if ($items)が「配列が空でない」の意味でよく使われるのはこのためです。問題になるのは"0"の行です。誰かが0と入力したフォームの項目は空でない文字列ですが、if ($_POST['qty'])はそれをfalseとして扱います。0が正当な答えである場合は、明示的に比較してください(if ($qty !== ''))。empty()が返す値も同じルールで決まります。
if: と endif; でHTMLの中にif else
HTMLタグの間では、波括弧を見失いがちです。PHPには別の構文があります。条件のあとにコロン、ほかの分岐にはelseif ...:とelse:、最後にendif;です。このブロックを実行してから、Pageタブの点数をクリックしてください。各リンクは新しい$_GET['score']で同じスクリプトをもう一度実行します。
<?= $score ?>は<?php echo $score; ?>の短縮形です。同じコロン形式はループにもあり(foreach: endforeach;、while: endwhile;)、ほとんどのPHPテンプレートで使われています。
1行のifと三項演算子
文が1つだけなら、波括弧なしで条件のあとに書けます。動きはしますが、次に追加した行はifの中に入らないので、多くのスタイルガイドは常に波括弧を付けることを求めています。2つの値から1つを選ぶなら、三項演算子のほうが完全なif/elseより短く書けます。
1つの変数を多くの値と比較する場合は、長いelseifの連鎖よりmatch式のほうが読みやすくなります。
ネストせずに早めにreturnする
深くネストしたifブロックは追いにくくなります。関数の中では、失敗するケースを先に確認してすぐにreturnしましょう。そうすれば、本来の処理が左端にそろいます。
よくあるミス:条件で==の代わりに=を使う
=が1つだと代入です。if ($role = 'admin')は$roleに'admin'を入れてからその文字列を判定するので、trueになります。すべてのユーザーでブロックが実行され、しかも$roleの値も壊れます。
型の自動変換を望む理由がなければ、比較には===を使います。定数を先に書く人もいます(if ('admin' === $role))。そうすれば=が1つ抜けたときに、黙って代入されるのではなくエラーになります。
よくある質問
PHPのelseifとelse ifの違いは何ですか?
波括弧を使う場合は同じ動きです。else ifは、本体が別のifであるelseです。コロン構文(if (...): ... endif;)ではelseifしか動かず、else ifは構文エラーです。どこでもelseifを使えば、この違いを気にせずにすみます。
PHPのif文で複数の条件を確認するには?
&&(すべてtrue)か||(少なくとも1つ)でつなぎます:if ($age >= 18 && $hasTicket) { ... }。2つを混ぜるときは括弧を使います。たとえばif ($isAdmin || ($isOwner && $isActive))です。
PHPでif文を1行で書くには?
文が1つだけなら、波括弧なしで条件のあとに書けます:if ($debug) echo 'debug mode';。1行で2つの値から選ぶには三項演算子を使います:$label = $count === 1 ? 'item' : 'items';。
PHPでHTMLの中にif elseを書くには?
HTMLタグの間で読みやすい別の構文を使います:<?php if ($loggedIn): ?> <p>Welcome back</p> <?php else: ?> <a href="/login">Log in</a> <?php endif; ?>。