PHP: 条件判断
程序不是只按一条路走到底——它需要根据不同的条件做不同的事。"如果用户登录了,显示个人信息;如果没登录,显示登录按钮",这就是条件判断的核心。
1. if 语句
最简单的判断:条件为 true 时执行代码块。
PHP
<?php
$score = 85;
if ($score >= 60) {
echo "及格了!";
}
?>
💡 提示:
if 的 () 里写的条件最终会被转为布尔值。空字符串、0、"0"、null、空数组都是 false,其余都是 true(回顾第4课的布尔转换规则)。
2. if...else 语句
条件成立走一条路,不成立走另一条:
PHP
<?php
$age = 16;
if ($age >= 18) {
echo "欢迎进入";
} else {
echo "未成年人禁止进入";
}
?>
3. if...elseif...else 多分支
PHP
<?php
$score = 85;
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 80) {
echo "良好";
} elseif ($score >= 70) {
echo "中等";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
?>
⚠️ 注意: PHP 中是
elseif(一个词),也可以写 else if(两个词)。两种写法效果一样,但 elseif 是官方推荐写法。
4. switch 语句
当有很多个精确匹配分支时,switch 比一连串 if/elseif 更清晰:
PHP
<?php
$day = "周三";
switch ($day) {
case "周一":
echo "新的一周开始了!";
break;
case "周五":
echo "马上周末了!";
break;
case "周六":
case "周日":
echo "周末愉快!";
break;
default:
echo "工作日继续加油!";
}
?>
| 特性 | 说明 |
|---|---|
case |
匹配的值,用 == 宽松比较 |
break |
跳出 switch,忘记写会穿透到下一个 case |
default |
所有 case 都不匹配时执行(可选) |
| 穿透利用 | 多个 case 共享一个代码块时故意不写 break |
🔥 易错: 忘记
break 会导致"穿透"——执行完一个 case 后继续执行下一个 case 的代码!PHP 的 switch 没有自动 break。
5. match 表达式(PHP 8.0)
PHP 8 引入的 match 是 switch 的现代替代品,更安全更简洁:
▶ 示例:match vs switch
PHP
<?php
$day = "周三";
$message = match($day) {
"周一" => "新的一周开始了!",
"周五" => "马上周末了!",
"周六", "周日" => "周末愉快!",
default => "工作日继续加油!",
};
echo $message; // 工作日继续加油!
?>
match 相比 switch 的三大优势:
| switch | match | |
|---|---|---|
| 比较方式 | ==(宽松比较) |
===(严格比较) |
| 返回值 | 无(需要自己 break 或赋值) | ✅ 直接返回结果 |
| 穿透问题 | ⚠️ 会穿透(需要 break) | ✅ 不会穿透 |
| 默认项 | default(可选) |
default(必须写,否则报错) |
| 多条件 | 穿透实现 | 'A', 'B' => ... 逗号分隔 |
▶ 示例:match 严格比较
PHP
<?php
$code = 200;
$httpCode = "200"; // 注意是字符串
// match 用 === 严格比较
$result = match($code) {
200 => "成功", // $code === 200 是 true
default => "其他",
};
echo $result; // 成功
// switch 用 == 宽松比较,两者都会匹配
?>
💡 提示: PHP 8.0+ 优先用
match。只有需要复杂逻辑(比如 case 内部有很多语句)时才用 switch。
6. 条件语句与 HTML 混写
这是 PHP 做 Web 页面最常用的模式——用替代语法让 if 语句在 HTML 中更可读:
PHP
<?php
$isLogin = true;
?>
<!-- 用替代语法:冒号+endif -->
<?php if ($isLogin): ?>
<div class="user-info">
<!-- TODO: 替换为实际用户头像图片 -->
<img src="https://i.pravatar.cc/80">
<span>欢迎回来,小明!</span>
<a href="/logout.php">退出</a>
</div>
<?php else: ?>
<div class="login-btn">
<a href="/login.php">请登录</a>
</div>
<?php endif; ?>
| 标准语法 | 替代语法(HTML中推荐) |
|---|---|
if () { } |
if (): ... endif; |
if () { } else { } |
if (): ... else: ... endif; |
if () { } elseif () { } else { } |
if (): ... elseif (): ... else: ... endif; |
foreach () { } |
foreach (): ... endforeach; |
while () { } |
while (): ... endwhile; |
for () { } |
for (): ... endfor; |
▶ 示例:条件混写综合
PHP
<?php
$vip = true;
$balance = 800;
?>
<!DOCTYPE html>
<html>
<body>
<?php if ($vip): ?>
<div class="vip-badge">VIP会员</div>
<?php endif; ?>
<?php if ($balance > 500): ?>
<button>立即提现</button>
<?php elseif ($balance > 0): ?>
<p>余额不足500元,无法提现</p>
<?php else: ?>
<p>余额为0,去充值吧!</p>
<?php endif; ?>
</body>
</html>
💡 提示: 在 HTML 模板中写条件判断时,替代语法(
if (): ... endif;)比花括号({})好读得多。 大括号在哪里结束需要数配对,而 endif; 一眼就知道这是 if 的结束。
❓ 常见问题
Q switch 和 match 怎么选?
A PHP 8.0+ 优先用 match——更安全(
=== 严格比较)、更简洁(直接返回值)、不会穿透。复杂逻辑(case 内多行代码)用 switch。Q if 嵌套很多层怎么办?
A 超过 3 层嵌套就该重构了。(1) 提前 return(卫语句);(2) 把条件组合成一个变量;或者 (3) 用 match 替代多层 if/elseif。
Q
else if 和 elseif 有区别吗?A 没有功能区别。
elseif 是 PHP 原生关键字(推荐),else if 是嵌套写法。效果完全一样。📖 小节
if→elseif→else处理多分支条件判断switch适合多个精确匹配,注意break防穿透match(PHP 8+)比 switch 更安全(===严格比较、不穿透、直接返回值)- HTML 模板中用替代语法(
if (): ... endif;)比花括号更好读 - 条件太多时考虑用
match或提前return减少嵌套
📝 作业
- 写一个成绩评级程序:90+为A,80-89为B,70-79为C,60-69为D,60以下为F。分别用
if/elseif和match各实现一遍,对比两种写法。 - 创建一个模拟网页页面,用替代语法根据假定的用户状态显示不同内容:未登录显示登录按钮,已登录显示用户名和退出链接,已登录且是VIP额外显示VIP徽章。
- 写一个判断闰年的程序:能被4整除但不能被100整除,或者能被400整除的年份是闰年。