一、回顾与本篇目标
上一篇你学习了 PHP 的变量、数据类型、echo 输出和类型转换。你知道变量以 $ 开头,字符串用点号拼接,双引号支持变量插值。
这一篇我们要学的是控制流——让程序不再只是从上到下直线执行,而是能根据条件选择不同的路径,以及重复执行某段代码。这两个能力加在一起,你的程序就能处理几乎所有的逻辑了。
如果你已经学过 C 语言或 JavaScript,这一篇你会觉得非常熟悉——PHP 的条件判断和循环语法,和它们几乎一模一样。PHP 从 C 语言继承了整套控制流语法,又加入了一些专为 Web 模板设计的替代写法。
本篇的目标:
- 掌握
if/elseif/else条件判断 - 学会 PHP 在 HTML 中的替代语法
- 掌握
for循环和while循环 - 学会
foreach循环遍历数组 - 掌握
break和continue的用法 - 理解
switch多分支选择
二、条件判断:if/elseif/else
PHP 的条件判断和 C 语言、JavaScript 的语法几乎完全相同——条件用括号包裹,代码块用花括号。
基本结构
if (条件) {
// 条件成立时执行
} elseif (另一个条件) {
// 第一个条件不成立,但第二个条件成立时执行
} else {
// 所有条件都不成立时执行
}
和 C/JS/Python 的对比
| 特性 | C | JavaScript | Python | PHP |
|---|---|---|---|---|
| 条件包裹 | ( ) |
( ) |
不需要括号 | ( ) |
| 代码块 | { } |
{ } |
缩进 + 冒号 | { } |
| 多分支 | else if |
else if |
elif |
elseif 或 else if |
PHP 中 elseif 和 else if 都可以用,两者完全等价。elseif(连在一起)是 PHP 特有的写法,更推荐。
完整示例:成绩判断
<?php
$score = 85;
if ($score >= 90) {
echo "等级:优秀";
} elseif ($score >= 80) {
echo "等级:良好";
} elseif ($score >= 70) {
echo "等级:中等";
} elseif ($score >= 60) {
echo "等级:及格";
} else {
echo "等级:不及格";
}
// 输出:等级:良好
?>
PHP 中”真”和”假”的定义
上一篇我们提到了 PHP 的 Falsy 值。这里再强化一下:
// 以下值在条件判断中都被视为 false
if (false) { } // false 本身
if (0) { } // 整数 0
if (0.0) { } // 浮点数 0.0
if ("") { } // 空字符串
if ("0") { } // 字符串 "0" —— 注意!这个是 PHP 特有的
if ([]) { } // 空数组
if (null) { } // NULL
// 其他所有值都是 true
if (true) { } // true 本身
if (1) { } // 非零整数
if (-1) { } // 负数也是 true
if ("hello") { } // 非空字符串
if ("00") { } // 字符串 "00" 是 true(和 "0" 不同!)
if ([1, 2]) { } // 非空数组
"0" 是 falsy 这一点,经常被当作 PHP 面试题。它的逻辑是:字符串 "0" 在数值上下文中会被转换成整数 0,而 0 是 falsy。
三元运算符
PHP 的三元运算符和 C/JS 完全一样:
$age = 20;
$status = ($age >= 18) ? "成年" : "未成年";
echo $status; // 成年
PHP 还支持简写三元运算符(PHP 5.3+):
$username = $input ?: "默认用户名";
// 等价于
$username = $input ? $input : "默认用户名";
// 如果 $input 是 truthy,就用 $input;否则用默认值
NULL 合并运算符(PHP 7+):
$name = $_GET['name'] ?? '未提供';
// 等价于
$name = isset($_GET['name']) ? $_GET['name'] : '未提供';
// 区别:?? 只在变量未定义或为 NULL 时使用默认值
这是处理用户输入和表单数据时非常常用的写法。
三、PHP 在 HTML 中的替代语法
如果你要在 HTML 中嵌入 PHP 的条件判断和循环,用花括号 {} 会让代码显得很乱——括号嵌套括号,很难看清结构。PHP 提供了一套替代语法,专门为 Web 模板设计。
| 标准语法 | 替代语法 |
|---|---|
if (...) { |
if (...): |
} elseif (...) { |
elseif (...): |
} else { |
else: |
} |
endif; |
标准语法(适合纯 PHP 文件):
<?php
if ($logged_in) {
echo "<p>欢迎回来!</p>";
} else {
echo "<p>请先登录</p>";
}
?>
替代语法(适合 HTML 中嵌入 PHP):
<?php if ($logged_in): ?>
<p>欢迎回来!</p>
<?php else: ?>
<p>请先登录</p>
<?php endif; ?>
在替代语法中,HTML 代码在 if: 和 else: 之间,不需要用 echo 输出——直接写 HTML 就行。这让模板文件(如 WordPress 主题)中的逻辑判断非常清晰。
同样,循环也有替代语法:
<ul>
<?php foreach ($users as $user): ?>
<li><?= $user['name'] ?></li>
<?php endforeach; ?>
</ul>
四、for 循环
PHP 的 for 循环和 C 语言、JavaScript 完全一样——三要素(初始化、条件、更新)用分号分隔。
基本语法
for (初始化; 条件; 更新) {
// 循环体
}
完整示例
<?php
// 打印 1 到 5
for ($i = 1; $i <= 5; $i++) {
echo "第 {$i} 次循环<br>";
}
// 循环变量可以是从 0 开始的
for ($j = 0; $j < 10; $j++) {
echo $j . " ";
}
// 输出:0 1 2 3 4 5 6 7 8 9
?>
和 Python 的区别
如果你学过 Python,要特别注意:PHP 的 for 是”计数循环”(手动控制初始值、终止条件、步长),不是”遍历循环”。Python 的 for 遍历的是可迭代对象,PHP 对应的功能是 foreach。
for 循环的变体
<?php
// 初始化放在外面
$i = 0;
for (; $i < 5; $i++) {
echo $i;
}
// 更新放在循环体里
for ($i = 0; $i < 5;) {
echo $i;
$i++;
}
// 无限循环(三个部分全省略)
for (;;) {
echo "无限循环";
break; // 用 break 退出
}
?>
五、while 循环和 do…while 循环
while 循环
while 循环的逻辑是:先判断条件,条件成立则执行循环体,然后再次判断条件,直到条件不成立。
<?php
$count = 1;
while ($count <= 5) {
echo "第 {$count} 次循环<br>";
$count++;
}
echo "循环结束,count = {$count}"; // count = 6
?>
while 和 for 怎么选?
- 知道循环次数(比如遍历数组、执行 N 次)→ 用
for。 - 不知道循环次数(比如让用户一直输入直到输入正确、读数据库直到没有数据)→ 用
while。
do…while 循环
do...while 和 while 的唯一区别是:do…while 先执行一次循环体,再判断条件。 这意味着循环体至少会被执行一次。
<?php
$number = 1;
do {
echo "当前数字:{$number}<br>";
$number++;
} while ($number <= 5);
?>
即使初始条件不成立,循环体也会执行一次:
<?php
$number = 10;
do {
echo "至少会执行一次"; // 这行会输出
} while ($number <= 5); // 条件不成立,循环结束
?>
六、foreach:遍历数组的利器
foreach 是 PHP 中专门用来遍历数组的循环。它是 PHP 中最常用的循环类型——因为 Web 开发中大量时间都在处理数组数据。
遍历数组的值
<?php
$fruits = ["苹果", "香蕉", "橘子"];
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}
// 苹果
// 香蕉
// 橘子
?>
同时获取键和值
<?php
$user = [
"name" => "张三",
"age" => 28,
"city" => "上海"
];
foreach ($user as $key => $value) {
echo "{$key}: {$value}<br>";
}
// name: 张三
// age: 28
// city: 上海
?>
foreach 和 for 的对比
foreach 专门用于遍历数组,不需要手动管理索引。Python 的 for item in list 和 JavaScript 的 for...of 和 for...in 功能与之类似。
七、break 和 continue
break:立即退出整个循环
<?php
// 找到第一个能被 7 整除的数就停止
for ($i = 1; $i <= 50; $i++) {
if ($i % 7 == 0) {
echo "找到了:{$i}";
break; // 退出循环,后面的 8 到 50 都不会执行
}
}
// 输出:找到了:7
?>
break 可以接受一个数字参数,用于跳出多层循环:
<?php
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
if ($i * $j == 6) {
break 2; // 跳出两层循环
}
echo "{$i}×{$j} ";
}
}
?>
continue:跳过本轮循环,继续下一轮
<?php
// 只打印奇数
for ($i = 1; $i <= 10; $i++) {
if ($i % 2 == 0) {
continue; // 跳过偶数
}
echo $i . " ";
}
// 输出:1 3 5 7 9
?>
continue 也可以接受数字参数,用于跳过外层循环的当前迭代。
八、switch:多分支选择
当需要根据一个变量的不同值来执行不同代码时,用 switch 比写一长串 if...elseif 更清晰。
<?php
$day = 3;
switch ($day) {
case 1:
echo "星期一";
break;
case 2:
echo "星期二";
break;
case 3:
echo "星期三";
break;
case 4:
echo "星期四";
break;
case 5:
echo "星期五";
break;
case 6:
case 7:
echo "周末!";
break;
default:
echo "无效的日期";
break;
}
// 输出:星期三
?>
和 C 语言一样,每个 case 后面需要 break,否则会”穿透”到下一个 case。case 6 和 case 7 共享同一个处理逻辑,就是利用了这种”穿透”特性。
九、综合演示:猜数字游戏
下面这段代码综合运用了条件判断、循环和用户输入:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>猜数字游戏</title>
<style>
body { font-family: sans-serif; padding: 40px; background: #f0f4f8; text-align: center; }
.game-box { background: white; padding: 30px; border-radius: 12px; max-width: 400px; margin: 0 auto; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
.message { margin: 20px 0; font-size: 18px; }
input { padding: 10px; font-size: 16px; width: 100px; text-align: center; }
button { padding: 10px 20px; font-size: 16px; background: #4a90d9; color: white; border: none; border-radius: 6px; cursor: pointer; }
</style>
</head>
<body>
<div class="game-box">
<h2>🎯 猜数字游戏</h2>
<p>我想了一个 1 到 100 之间的数字,你猜猜看?</p>
<?php
// 生成随机数(如果还没生成)
session_start();
if (!isset($_SESSION['secret'])) {
$_SESSION['secret'] = rand(1, 100);
$_SESSION['attempts'] = 0;
}
$secret = $_SESSION['secret'];
$message = "";
// 处理用户猜测
if (isset($_GET['guess'])) {
$guess = (int)$_GET['guess'];
$_SESSION['attempts']++;
if ($guess > $secret) {
$message = "📈 太大了,再小一点";
} elseif ($guess < $secret) {
$message = "📉 太小了,再大一点";
} else {
$message = "🎉 恭喜你!答案就是 {$secret}!你一共猜了 {$_SESSION['attempts']} 次。";
// 重置游戏
unset($_SESSION['secret']);
unset($_SESSION['attempts']);
}
}
?>
<?php if ($message): ?>
<div class="message"><?= $message ?></div>
<?php endif; ?>
<form method="GET">
<input type="number" name="guess" min="1" max="100" placeholder="1-100" required>
<br><br>
<button type="submit">猜!</button>
</form>
</div>
</body>
</html>
代码解析:
session_start()开启会话,$_SESSION用来跨请求存储数据(后面会详细讲)。这里用 Session 存储随机数和猜测次数,刷新页面不会丢失。rand(1, 100)生成 1 到 100 的随机整数。isset($_GET['guess'])判断用户是否提交了猜测。- 条件判断
if ($guess > $secret)给出”太大”或”太小”的提示。 - 猜对后
unset()销毁 Session 中的游戏数据,重新开始。
这个猜数字游戏是一个完整的、带用户交互的 PHP 程序。你可以把它保存为 guess.php,用 php -S localhost:8080 启动服务器,在浏览器中玩。
十、本篇动手练习
练习 1:判断闰年
新建 practice3-1.php。闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。用 if/else 判断一个年份是否是闰年。测试几个年份:2000(是)、2023(不是)、2024(是)、1900(不是)。
练习 2:乘法口诀表
新建 practice3-2.php,用嵌套 for 循环输出 9×9 乘法口诀表,用 HTML 表格渲染。
练习 3:遍历数组
新建 practice3-3.php,创建以下关联数组:
$students = [
["name" => "张三", "score" => 85],
["name" => "李四", "score" => 92],
["name" => "王五", "score" => 78],
["name" => "赵六", "score" => 95],
["name" => "孙七", "score" => 60],
];
用 foreach 遍历,输出每个学生的姓名、成绩和等级(>=90 优秀,>=80 良好,>=60 及格,<60 不及格)。
练习 4:数字反转
新建 practice3-4.php,用 while 循环把一个整数反转输出。例如输入 12345,输出 54321。提示:每次用取余拿到最后一位,累加到结果变量上,原数除以 10(整除)。
十一、本篇小结
这一篇你学会了 PHP 的控制流:
if/elseif/else:和 C/JS 语法几乎一样。PHP 可以用elseif(连写)。记住"0"是 falsy。- 三元运算符和 NULL 合并运算符:
?:和??是处理默认值的高频写法。 - 替代语法:在 HTML 模板中用
if(): ... endif;代替花括号,代码更清晰。 for循环:和 C/JS 完全一样,三要素用分号分隔。while和do...while:先判断 vs 先执行。foreach:PHP 最常用的循环,专门遍历数组。可以只取值,也可以同时取键和值。break和continue:break退出整个循环,continue跳过本轮。都支持数字参数跳出多层。switch/case:多分支选择,记得写break。
下一篇,我们学习 PHP 中最强大的数据结构——数组。PHP 的数组同时兼任了列表和字典两种角色,还内置了排序、过滤、合并等数十个实用函数。
下一篇预告
下一篇——《PHP 数组——最强大的数据结构》:索引数组和关联数组、多维数组、数组的增删改查、foreach 深入、常用数组函数(排序、过滤、映射、合并、去重)。这是 PHP 开发中最核心的技能。
PHP 零基础入门,每周更新。














暂无评论内容