第3章:控制结构

控制结构是编程语言的骨架,它控制着程序的执行流程。掌握控制结构是编写复杂程序的基础。在本章中,我们将学习PHP中的各种控制结构,包括条件语句、循环语句、跳转语句和文件包含功能。

学习目标

完成本章学习后,你将能够:

  • 熟练使用if、elseif、else条件语句
  • 掌握switch语句的使用场景和语法
  • 理解并使用for、while、do-while、foreach循环
  • 学会使用break、continue、return控制流程
  • 掌握include、require、include_once、require_once的使用
  • 能够编写条件逻辑和循环程序

本章目录

控制结构概述

控制结构决定了代码的执行顺序,让我们能够:

  • 根据条件执行不同的代码块
  • 重复执行某些操作
  • 控制程序流程
  • 组织代码结构

控制结构的分类

  1. 顺序结构:代码按从上到下的顺序执行
  2. 选择结构:根据条件选择执行不同的代码分支
  3. 循环结构:重复执行某段代码
  4. 跳转结构:改变程序的正常执行流程

基本控制流程图

开始
  │
  ▼
条件判断 ──── 否 ────┐
  │是               │
  ▼                │
执行代码块          │
  │                │
  ▼                │
继续执行            │
  │                │
  ▼                │
结束 ←──────────────┘

实际应用示例

让我们通过一个完整的用户管理系统示例来了解控制结构的实际应用:

<?php
    // 用户权限管理系统示例
    class UserSystem {
        private $users = [];
        private $currentUser = null;
        private $loginAttempts = 0;
        private $maxAttempts = 3;

        public function __construct() {
            // 初始化一些测试用户
            $this->users = [
                ['username' => 'admin', 'password' => '123456', 'role' => 'admin', 'status' => 'active'],
                ['username' => 'user1', 'password' => 'password', 'role' => 'user', 'status' => 'active'],
                ['username' => 'guest', 'password' => 'guest123', 'role' => 'guest', 'status' => 'inactive']
            ];
        }

        // 用户登录 - 使用条件判断
        public function login($username, $password) {
            // 检查登录尝试次数
            if ($this->loginAttempts >= $this->maxAttempts) {
                echo "错误:登录尝试次数过多,请稍后再试!<br>";
                return false;
            }

            // 验证用户输入
            if (empty($username) || empty($password)) {
                echo "错误:用户名和密码不能为空!<br>";
                return false;
            }

            // 查找用户
            $user = $this->findUser($username);

            if ($user === null) {
                echo "错误:用户不存在!<br>";
                $this->loginAttempts++;
                return false;
            }

            // 验证密码
            if (!$this->verifyPassword($password, $user['password'])) {
                echo "错误:密码错误!<br>";
                $this->loginAttempts++;
                return false;
            }

            // 检查用户状态
            if ($user['status'] !== 'active') {
                echo "错误:账户已被禁用!<br>";
                return false;
            }

            // 登录成功
            $this->currentUser = $user;
            $this->loginAttempts = 0;
            echo "欢迎,{$user['username']}!登录成功!<br>";
            return true;
        }

        // 查找用户 - 使用循环
        private function findUser($username) {
            foreach ($this->users as $user) {
                if ($user['username'] === $username) {
                    return $user;
                }
            }
            return null;
        }

        // 验证密码
        private function verifyPassword($inputPassword, $storedPassword) {
            return $inputPassword === $storedPassword;
        }

        // 根据用户角色显示菜单 - 使用switch
        public function showMenu() {
            if ($this->currentUser === null) {
                echo "请先登录!<br>";
                return;
            }

            echo "<h3>主菜单</h3>";
            switch ($this->currentUser['role']) {
                case 'admin':
                    echo "- 用户管理<br>";
                    echo "- 系统设置<br>";
                    echo "- 数据备份<br>";
                    echo "- 查看日志<br>";
                    break;

                case 'user':
                    echo "- 个人信息<br>";
                    echo "- 发表文章<br>";
                    echo "- 查看消息<br>";
                    break;

                case 'guest':
                    echo "- 浏览内容<br>";
                    echo "- 搜索功能<br>";
                    break;

                default:
                    echo "无可用功能<br>";
                    break;
            }
        }

        // 显示用户列表 - 使用循环和条件
        public function displayUsers() {
            if ($this->currentUser === null) {
                echo "请先登录!<br>";
                return;
            }

            // 检查权限
            if ($this->currentUser['role'] !== 'admin') {
                echo "权限不足!只有管理员可以查看用户列表。<br>";
                return;
            }

            echo "<h3>用户列表</h3>";
            echo "<table border='1'>";
            echo "<tr><th>用户名</th><th>角色</th><th>状态</th><th>操作</th></tr>";

            foreach ($this->users as $index => $user) {
                $statusColor = $user['status'] === 'active' ? 'green' : 'red';
                $roleColor = $user['role'] === 'admin' ? 'blue' : 'black';

                echo "<tr>";
                echo "<td>{$user['username']}</td>";
                echo "<td style='color: {$roleColor}'>{$user['role']}</td>";
                echo "<td style='color: {$statusColor}'>{$user['status']}</td>";
                echo "<td>";

                // 根据用户状态显示不同操作
                if ($user['status'] === 'active') {
                    echo "<button>禁用</button> ";
                } else {
                    echo "<button>启用</button> ";
                }

                // 不能删除自己
                if ($user['username'] !== $this->currentUser['username']) {
                    echo "<button>删除</button>";
                } else {
                    echo "<button disabled>删除</button>";
                }

                echo "</td>";
                echo "</tr>";
            }

            echo "</table>";
        }

        // 批量操作 - 使用多种控制结构
        public function batchOperation($operation, $usernames = []) {
            if ($this->currentUser === null || $this->currentUser['role'] !== 'admin') {
                echo "权限不足!<br>";
                return;
            }

            if (empty($usernames)) {
                echo "请选择要操作的用户!<br>";
                return;
            }

            $successCount = 0;
            $failCount = 0;

            foreach ($usernames as $username) {
                $userIndex = $this->findUserIndex($username);

                if ($userIndex === null) {
                    echo "用户 {$username} 不存在!<br>";
                    $failCount++;
                    continue;
                }

                // 防止操作当前登录的管理员
                if ($username === $this->currentUser['username']) {
                    echo "不能对当前登录用户进行操作!<br>";
                    $failCount++;
                    continue;
                }

                switch ($operation) {
                    case 'disable':
                        $this->users[$userIndex]['status'] = 'disabled';
                        echo "用户 {$username} 已禁用<br>";
                        $successCount++;
                        break;

                    case 'enable':
                        $this->users[$userIndex]['status'] = 'active';
                        echo "用户 {$username} 已启用<br>";
                        $successCount++;
                        break;

                    case 'delete':
                        array_splice($this->users, $userIndex, 1);
                        echo "用户 {$username} 已删除<br>";
                        $successCount++;
                        break;

                    default:
                        echo "未知操作:{$operation}<br>";
                        $failCount++;
                        break;
                }
            }

            echo "<strong>操作完成!成功:{$successCount},失败:{$failCount}</strong><br>";
        }

        // 查找用户索引
        private function findUserIndex($username) {
            foreach ($this->users as $index => $user) {
                if ($user['username'] === $username) {
                    return $index;
                }
            }
            return null;
        }

        // 处理用户请求 - 复杂的条件逻辑
        public function handleRequest($request) {
            echo "<h2>处理请求:{$request}</h2>";

            if ($this->currentUser === null) {
                // 未登录用户的请求
                switch ($request) {
                    case 'login':
                        $this->login('admin', '123456');
                        break;
                    case 'register':
                        echo "跳转到注册页面<br>";
                        break;
                    case 'about':
                        echo "显示关于页面<br>";
                        break;
                    default:
                        echo "未知请求,请先登录<br>";
                        break;
                }
            } else {
                // 已登录用户的请求
                $userRole = $this->currentUser['role'];

                if ($request === 'logout') {
                    echo "用户 {$this->currentUser['username']} 已退出登录<br>";
                    $this->currentUser = null;
                    return;
                }

                // 根据角色处理不同请求
                if ($userRole === 'admin') {
                    switch ($request) {
                        case 'users':
                            $this->displayUsers();
                            break;
                        case 'settings':
                            echo "显示系统设置<br>";
                            break;
                        case 'backup':
                            echo "执行数据备份<br>";
                            break;
                        default:
                            $this->showMenu();
                            break;
                    }
                } elseif ($userRole === 'user') {
                    switch ($request) {
                        case 'profile':
                            echo "显示个人信息<br>";
                            break;
                        case 'articles':
                            echo "显示我的文章<br>";
                            break;
                        case 'messages':
                            echo "显示消息<br>";
                            break;
                        default:
                            $this->showMenu();
                            break;
                    }
                } else { // guest
                    switch ($request) {
                        case 'browse':
                            echo "浏览内容<br>";
                            break;
                        case 'search':
                            echo "搜索功能<br>";
                            break;
                        default:
                            $this->showMenu();
                            break;
                    }
                }
            }
        }
    }

    // 使用示例
    $userSystem = new UserSystem();

    echo "<h1>用户管理系统演示</h1>";

    // 演示各种控制结构的应用
    $userSystem->handleRequest('about'); // 未登录状态
    $userSystem->handleRequest('login'); // 登录

    echo "<hr>";

    $userSystem->handleRequest('users'); // 管理员功能
    $userSystem->handleRequest('settings'); // 系统设置

    echo "<hr>";

    // 演示批量操作
    $userSystem->batchOperation('disable', ['guest', 'user1']);

    echo "<hr>";

    $userSystem->handleRequest('logout'); // 退出登录
?>

控制结构的重要性

1. 程序逻辑的基础

控制结构是所有编程语言的核心概念,它们让我们能够:

  • 创建有逻辑的程序
  • 处理各种业务场景
  • 实现复杂的算法

2. 解决实际问题的工具

  • 条件判断:处理不同的业务规则
  • 循环操作:批量处理数据
  • 文件包含:代码模块化和重用

3. 代码组织的方式

良好的控制结构使用能让代码:

  • 更容易理解和维护
  • 更高效和可靠
  • 更符合业务逻辑

学习建议

1. 理论与实践结合

  • 先理解每种控制结构的概念
  • 通过编写简单代码练习
  • 在实际项目中应用

2. 循序渐进

  • 从简单的if-else开始
  • 逐步学习复杂结构
  • 最后综合运用

3. 注意常见陷阱

  • 避免无限循环
  • 注意条件的完整性
  • 合理使用break和continue

章节导航

接下来我们将深入学习:

  1. 条件语句:学习如何根据不同条件执行不同代码
  2. 循环语句:掌握重复执行代码的技巧
  3. 跳转语句:了解如何控制程序的执行流程
  4. 文件包含:学会模块化编程

每个章节都包含详细的理论解释、丰富的代码示例和实际应用案例,帮助你全面掌握PHP控制结构的使用。


准备好了吗? 让我们开始学习PHP控制结构的详细知识!记住,控制结构是编程的基础,掌握好这些概念将为你后续的PHP学习打下坚实的基础。