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 引入的 matchswitch 的现代替代品,更安全更简洁:

▶ 示例: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 ifelseif 有区别吗?
A 没有功能区别。elseif 是 PHP 原生关键字(推荐),else if 是嵌套写法。效果完全一样。

📖 小节

📝 作业

  1. 写一个成绩评级程序:90+为A,80-89为B,70-79为C,60-69为D,60以下为F。分别用 if/elseifmatch 各实现一遍,对比两种写法。
  2. 创建一个模拟网页页面,用替代语法根据假定的用户状态显示不同内容:未登录显示登录按钮,已登录显示用户名和退出链接,已登录且是VIP额外显示VIP徽章。
  3. 写一个判断闰年的程序:能被4整除但不能被100整除,或者能被400整除的年份是闰年。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏