はじめに
前回の記事では、計算や比較に使う演算子について解説しました。
今回は、前回学んだ比較演算子や論理演算子を使って、条件によって実行する処理を切り替える「if文」について解説します。「点数によって評価を変える」「ログインしているかどうかで表示を変える」といった処理は、すべてif文で実現します。
条件分岐とは?
これまでの記事のプログラムは、上から順番にすべての行が実行されていました。条件分岐とは、「条件に当てはまる場合だけこの処理を行う」というように、条件によって実行する処理を分けることです。
PHPで条件分岐を書くための代表的な構文がif文です。
VBAのIf 条件 Then 〜 End Ifと同じ役割です。PHPではThenやEnd Ifの代わりに、条件を( )で囲み、処理を{ }で囲んで書きます。
if文の基本
if文は、次の形で書きます。
if (条件) {
// 条件がtrueのときに実行する処理
}( )の中の条件がtrueになったときだけ、{ }の中の処理が実行されます。
<?php
$score = 85;
if ($score >= 60) {
echo "合格です";
}$scoreは85なので、条件$score >= 60はtrueになり、「合格です」と表示されます。$scoreを45に変えると条件がfalseになり、何も表示されません。
else(条件に当てはまらない場合)
条件に当てはまらなかった場合の処理を書きたいときは、elseを使います。
<?php
$score = 45;
if ($score >= 60) {
echo "合格です";
} else {
echo "不合格です";
}条件がtrueならif側の処理、falseならelse側の処理が実行されます。どちらか一方だけが必ず実行される、という点がポイントです。
elseif(3つ以上に分ける)
条件を3つ以上に分けたいときは、elseifを使います。次の例は、点数によってA〜Dの評価を表示します。
<?php
$score = 72;
if ($score >= 90) {
echo "A評価";
} elseif ($score >= 80) {
echo "B評価";
} elseif ($score >= 70) {
echo "C評価";
} else {
echo "D評価";
}実行すると「C評価」と表示されます。if文は上から順番に条件を判定し、最初にtrueになったブロックだけを実行して終了します。72点は「90以上」「80以上」には当てはまらず、「70以上」で初めてtrueになるため、C評価になります。

条件を並べる順番を間違えると、意図しない結果になります。たとえば$score >= 80の判定を$score >= 90より先に書くと、95点でも最初の「80以上」でtrueになり、B評価と表示されてしまいます。範囲で分ける場合は、厳しい条件から順に書きましょう。
PHPではelse if(間にスペースあり)と書いても同じように動きますが、elseifと続けて書くのが一般的です。後述する代替構文ではelseifしか使えないため、elseifで統一しておくのがおすすめです。
条件の書き方
論理演算子で複数の条件を組み合わせる
前回の記事で解説した論理演算子を使うと、複数の条件をまとめて判定できます。
<?php
$age = 25;
$isMember = true;
if ($age >= 20 && $isMember) {
echo "20歳以上の会員です";
}
if (!$isMember) {
echo "会員登録をお願いします";
}$isMemberのように真偽値が入った変数は、$isMember === trueと書かなくても、そのまま条件に書けます。!を付けると「会員ではない場合」という条件になります。
真偽値以外の値を条件にする場合
if文の条件に真偽値以外の値を書くと、その値は真偽値に変換されてから判定されます。データ型の記事で紹介した「falseとみなされる値」を覚えておきましょう。
| falseとみなされる値 | 例 |
|---|---|
| false | false |
| 0・0.0 | 0、0.0 |
| 空の文字列・”0″ | ""、"0" |
| NULL | null |
| 空の配列 | [] |
<?php
$name = "0";
if ($name) {
echo "入力あり";
} else {
echo "入力なし"; // "0"はfalseとみなされるため、こちらが表示される
}「何か入力されているか」を判定したい場合、if ($name)と書くと、"0"という入力まで「入力なし」と判定されてしまいます。空文字かどうかを判定したいときは、if ($name !== "")のように比較演算子で明確に書くと安全です。
if文の入れ子(ネスト)
if文の中に、さらにif文を書くこともできます。これを入れ子(ネスト)と呼びます。
<?php
$age = 25;
$hasTicket = true;
if ($age >= 18) {
if ($hasTicket) {
echo "入場できます";
} else {
echo "チケットを購入してください";
}
} else {
echo "18歳未満は入場できません";
}入れ子が深くなるとコードが読みにくくなります。「両方の条件を満たすときだけ処理する」という場合は、&&で1つの条件にまとめると見通しがよくなります。
<?php
if ($age >= 18 && $hasTicket) {
echo "入場できます";
}HTMLと組み合わせる書き方(代替構文)
PHPはHTMLの中に埋め込んで使うことが多い言語です。HTMLの表示をif文で切り替えたいときは、{ }の代わりに:とendif;を使う代替構文を使うと、HTMLとPHPの区切りが分かりやすくなります。
<?php
$isLoggedIn = true;
$userName = "田中";
?>
<?php if ($isLoggedIn): ?>
<p>ようこそ、<?php echo $userName; ?>さん</p>
<?php else: ?>
<p>ログインしてください</p>
<?php endif; ?>$isLoggedInがtrueなら「ようこそ、田中さん」、falseなら「ログインしてください」の段落が表示されます。

if (条件):のように条件の後ろに:を付け、else:・elseif (条件):で分岐し、最後をendif;で閉じます。{ }で書くと閉じ括弧}がどのif文に対応するのか分かりにくくなりますが、代替構文ならendif;で終わりがはっきりします。WordPressのテーマファイルでもよく使われている書き方です。
実務サンプル(フォームの入力値をチェックする)
Webフォームで入力された年齢をチェックし、問題があればエラーメッセージを表示するサンプルです。「空欄ではないか」「数字か」「範囲内か」を順番に判定します(フォームから値を受け取る方法は、第2弾の「Webフォーム処理」で解説予定です。ここでは入力値を変数で代用しています)。

<?php
// フォームから届いた年齢(文字列)を想定
$inputAge = "150";
if ($inputAge === "") {
$message = "年齢を入力してください";
} elseif (!is_numeric($inputAge)) {
$message = "年齢は半角数字で入力してください";
} elseif ((int)$inputAge < 0 || (int)$inputAge > 120) {
$message = "年齢は0〜120の範囲で入力してください";
} else {
$message = "入力を受け付けました({$inputAge}歳)";
}
echo $message;is_numeric()は、値が数値として解釈できるかどうかをtrue/falseで返す関数です。$inputAgeの値を変えて実行すると、次のように結果が変わります。
| $inputAgeの値 | 表示されるメッセージ |
|---|---|
""(空欄) | 年齢を入力してください |
"abc" | 年齢は半角数字で入力してください |
"25"(全角) | 年齢は半角数字で入力してください |
"150" | 年齢は0〜120の範囲で入力してください |
"25" | 入力を受け付けました(25歳) |
elseifで上から順番にチェックしているため、最初に見つかった問題のメッセージだけが表示されます。「空欄のときに『数字で入力してください』と表示される」といった的外れなメッセージを防げるのが、この書き方のポイントです。
よくある質問・エラー対処
Q. 条件に関係なく、if文の中の処理が必ず実行されてしまいます
→ 次の2つの書き間違いがないか確認してください。
if ($x = 5)のように、比較の==(または===)ではなく代入の=を書いている。代入した値(5)がそのまま条件になるため、常にtrueになりますif ($x == 5);のように、条件の)の直後にセミコロンを付けている。if文がそこで終わってしまい、後ろの{ }はif文と関係なく必ず実行されます
Q. { }を省略して書いてもいいですか?
→ 処理が1行だけなら省略しても動きますが、後から2行目を追加したときに、2行目がif文の外側になってしまうミスが起こりやすくなります。1行だけの場合も{ }を付けておくのがおすすめです。
Q. Unclosed '{'やunexpected end of fileというエラーが出ます
→ どちらも、ブロックの終わりが見つからないときに表示されるエラーです。
Unclosed '{' on line 3:3行目の{に対応する}が足りませんsyntax error, unexpected end of file, expecting "elseif" or "else" or "endif":代替構文でendif;を書き忘れています
ブロックの開始と終了が正しく対応しているか確認してください。
おわりに(まとめ)
if文を使うと、条件によって実行する処理を切り替えられます。
- ✅ if (条件) { 処理 } で、条件がtrueのときだけ処理を実行する
- ✅ elseで条件に当てはまらない場合、elseifで3つ以上の分岐を書ける
- ✅ if文は上から順に判定し、最初にtrueになったブロックだけを実行する
- ✅ 論理演算子で複数の条件をまとめると、入れ子を減らせる
- ✅ HTMLと組み合わせるときは、if: 〜 endif; の代替構文が便利
- ✅ =と==の書き間違い、条件直後のセミコロンに注意する
次回は、条件分岐のもう1つの書き方「switch文」について解説します。
次回は、1つの値に応じて処理を分けるときに便利なswitch文と、PHP 8から使えるmatch式について解説予定です。
この記事が、少しでも誰かのお役に立てれば幸いです。
関連記事
当サイトの記事で使用したVBAなどのサンプルをDLできます
この記事のサンプルはありません!
ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!

