Menu

PHP if、elseif 和 else 语句及示例

if (condition) { ... } 只在条件为真时执行代码块,elseif 检查下一个条件,所有条件都不满足时执行 else。本文讲解 elseif 和 else if 的区别、&& 和 ||、真值,以及 HTML 模板中的 if: endif; 语法。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

if (condition) { ... } 只在条件为真时执行它的代码块。用 elseif (other condition) { ... } 处理更多情况,用 else { ... } 处理剩下的所有情况。PHP 从上往下检查条件,只执行第一个满足条件的代码块。

修改 $temperature 再运行一次。因为检查是从上往下进行的,24 在第二个条件处就停下了,永远不会走到 >= 10,尽管那个条件也为真。条件要按从最具体到最笼统的顺序排列。

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 写成一个词,就永远不会遇到这个错误。

用 && 和 || 组合多个条件

&&(与)要求两边都为真,||(或)要求至少一边为真,! 则对条件取反。一旦结果确定,PHP 就会停止求值,所以在 $user !== null && $user['active'] 中,只有存在用户时才会执行第二部分。

混用 && 和 || 时要加括号:&& 的优先级更高,括号能让后来读代码的人一眼看出你的意图。PHP 还有 and 和 or 关键字,但它们的优先级比 = 还低,所以 $ok = true and false; 会把 $ok 设为 true。坚持使用 && 和 ||。

if 中什么值算作真

条件不一定是布尔值。PHP 会对它进行转换,有少数几个值算作假:false、0、0.0、""、"0"、[] 和 null。其他所有值都为真,包括 "false"、" " 和 "0.0"。

if ($x) 如何看待每个值
Point at or tap a cell to read it as PHP.
$xboolempty
false
0
0.0
""
"0"
null
[]
" "
"0.0"
"a"
[0]
1
Every cell computed by PHP 8.3.19.

所以 if ($items) 是表达“数组不为空”的常见写法。容易踩坑的是 "0" 那一行:用户在表单字段里输入 0,得到的是一个非空字符串,但 if ($_POST['qty']) 会把它当作假。当零是有效答案时,要显式比较(if ($qty !== ''))。empty() 的返回值也由同样的规则决定。

在 HTML 中用 if: 和 endif; 写 if else

在 HTML 标签之间,花括号很容易对不上。PHP 提供了一种替代语法:条件后面写冒号,其他分支用 elseif ...: 和 else:,最后用 endif; 结束。运行这段代码,然后在“页面”标签页中点击分数:每个链接都会用新的 $_GET['score'] 重新运行同一个脚本。

<?= $score ?> 是 <?php echo $score; ?> 的简写。循环也有同样的冒号写法(foreach: endforeach;、while: endwhile;),大多数 PHP 模板用的都是这种写法。

单行 if 和三元运算符

条件后面可以直接跟一条不带花括号的语句。这样能运行,但你接下来添加的那一行不会在 if 里面,所以很多代码风格指南要求始终使用花括号。如果要从两个值中选一个,三元运算符比完整的 if/else 更简短。

当需要把一个变量和许多确切的值进行比较时,match 表达式比一长串 elseif 更好读。

提前返回,避免嵌套

层层嵌套的 if 代码块很难看懂。在函数里,先检查失败的情况并立即 return。这样主要逻辑就能靠左对齐,一目了然。

常见错误:在条件中把 == 写成 =

单个 = 表示赋值。if ($role = 'admin') 会把 'admin' 存进 $role,然后检测这个字符串,结果为真。于是这个代码块对每个用户都会执行,而且 $role 的值也被改错了。

除非你确实需要类型转换,否则比较时都用 ===。有些人会把常量写在前面(if ('admin' === $role)),这样漏写一个 = 时会直接报错,而不是悄悄地赋值。

常见问题

PHP 中 elseif 和 else if 有什么区别?

使用花括号时两者行为相同:else if 就是一个函数体为另一个 if 的 else。使用冒号语法(if (...): ... endif;)时只能用 elseif,else if 会导致解析错误。到处都用 elseif 就不用操心这个区别。

PHP 的 if 语句中怎么判断多个条件?

用 &&(全部为真)或 ||(至少一个为真)把它们连起来:if ($age >= 18 && $hasTicket) { ... }。两者混用时要加括号,例如 if ($isAdmin || ($isOwner && $isActive))。

PHP 中怎么把 if 语句写成一行?

条件后面可以直接跟一条不带花括号的语句:if ($debug) echo 'debug mode';。如果要在一行内从两个值中选一个,就用三元运算符:$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; ?>。

Coddy 编程语言插图

和 Coddy 一起学编程

开始