Skip to content

条件语句

概述

条件语句允许您的程序根据特定条件做出决策并执行不同的代码路径。PHP提供了几种类型的条件语句,包括if-else、switch、match(PHP 8+)和三元运算符。

If 语句

基本 If 语句

php
<?php
$age = 18;

if ($age >= 18) {
    echo "您符合投票条件。";
}

// 单行 if(不推荐,影响可读性)
if ($age >= 18) echo "符合投票条件。";

// 布尔条件
$isLoggedIn = true;
if ($isLoggedIn) {
    echo "欢迎回来!";
}

// 检查变量
$username = "john";
if ($username) {  // 非空字符串为真
    echo "你好,$username!";
}
?>

If-Else 语句

php
<?php
$temperature = 25;

if ($temperature > 30) {
    echo "外面很热!";
} else {
    echo "天气很宜人。";
}

// 多重条件
$score = 85;

if ($score >= 90) {
    echo "等级:A";
} else if ($score >= 80) {
    echo "等级:B";
} else if ($score >= 70) {
    echo "等级:C";
} else if ($score >= 60) {
    echo "等级:D";
} else {
    echo "等级:F";
}

// 替代语法(在模板中有用)
$user = getCurrentUser();
?>
<?php if ($user): ?>
    <p>欢迎,<?= $user->getName() ?></p>
<?php else: ?>
    <p>请登录。</p>
<?php endif; ?>

嵌套 If 语句

php
<?php
$user = getCurrentUser();

if ($user) {
    if ($user->isActive()) {
        if ($user->hasPermission('admin')) {
            echo "管理员访问已授权。";
        } else {
            echo "普通用户访问。";
        }
    } else {
        echo "账户已停用。";
    }
} else {
    echo "请登录。";
}

// 更好的方法 - 早期返回
function checkUserAccess($user) {
    if (!$user) {
        return "请登录。";
    }
    
    if (!$user->isActive()) {
        return "账户已停用。";
    }
    
    if ($user->hasPermission('admin')) {
        return "管理员访问已授权。";
    }
    
    return "普通用户访问。";
}
?>

复杂条件

条件中的逻辑运算符

php
<?php
$age = 25;
$hasLicense = true;
$hasInsurance = true;

// AND 条件
if ($age >= 18 && $hasLicense && $hasInsurance) {
    echo "您可以合法驾驶。";
}

// OR 条件
$isWeekend = true;
$isHoliday = false;

if ($isWeekend || $isHoliday) {
    echo "今天不用工作!";
}

// 混合逻辑运算符
$user = getCurrentUser();
$isAdmin = $user && $user->hasRole('admin');
$isModerator = $user && $user->hasRole('moderator');

if ($isAdmin || $isModerator) {
    echo "您有主持权限。";
}

// 使用括号提高清晰度
if (($age >= 16 && $age < 18) && ($hasLicense || $hasPermit)) {
    echo "您可以在限制条件下驾驶。";
}
?>

比较运算符

php
<?php
$userInput = "5";
$expectedValue = 5;

// 松散比较(类型强制转换)
if ($userInput == $expectedValue) {
    echo "值匹配(松散比较)";
}

// 严格比较(无类型强制转换)
if ($userInput === $expectedValue) {
    echo "值和类型都匹配";
} else {
    echo "类型不匹配";
}

// null 检查
$data = null;

if ($data === null) {
    echo "数据为 null";
}

if (is_null($data)) {
    echo "数据为 null(使用函数)";
}

// 空值检查
$array = [];
$string = "";

if (empty($array)) {
    echo "数组为空";
}

if (empty($string)) {
    echo "字符串为空";
}

// isset 检查
if (isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = 1;
}

// 空合并运算符(PHP 7+)
$page = $_GET['page'] ?? 1;
?>

Switch 语句

基本 Switch

php
<?php
$day = date('N'); // 1(周一)到 7(周日)

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;
}
?>

字符串 Switch

php
<?php
$action = $_GET['action'] ?? 'home';

switch ($action) {
    case 'home':
        showHomePage();
        break;
    case 'about':
        showAboutPage();
        break;
    case 'contact':
        showContactPage();
        break;
    case 'login':
    case 'signin':
        showLoginPage();
        break;
    case 'logout':
    case 'signout':
        performLogout();
        break;
    default:
        show404Page();
        break;
}

// 用户角色的 Switch
$userRole = $user->getRole();

switch ($userRole) {
    case 'admin':
        $permissions = ['read', 'write', 'delete', 'manage_users'];
        break;
    case 'editor':
        $permissions = ['read', 'write', 'delete'];
        break;
    case 'author':
        $permissions = ['read', 'write'];
        break;
    case 'subscriber':
        $permissions = ['read'];
        break;
    default:
        $permissions = [];
        break;
}
?>

Switch 穿透

php
<?php
$grade = 'B';

switch ($grade) {
    case 'A':
        echo "优秀!";
        // 穿透到下一个 case
    case 'B':
        echo "做得好!";
        // 穿透到下一个 case
    case 'C':
        echo "您通过了。";
        break;
    case 'D':
        echo "您勉强通过。";
        break;
    case 'F':
        echo "您没有通过。";
        break;
    default:
        echo "无效成绩。";
        break;
}

// 有意的穿透用于分组
$month = date('n');

switch ($month) {
    case 12:
    case 1:
    case 2:
        $season = "冬天";
        break;
    case 3:
    case 4:
    case 5:
        $season = "春天";
        break;
    case 6:
    case 7:
    case 8:
        $season = "夏天";
        break;
    case 9:
    case 10:
    case 11:
        $season = "秋天";
        break;
    default:
        $season = "未知";
        break;
}
?>

Match 表达式(PHP 8+)

基本 Match

php
<?php
$grade = 85;

$letter = match (true) {
    $grade >= 90 => 'A',
    $grade >= 80 => 'B',
    $grade >= 70 => 'C',
    $grade >= 60 => 'D',
    default => 'F'
};

echo $letter; // "B"

// 精确值的 Match
$day = 'Monday';

$mood = match ($day) {
    'Monday' => '疲惫',
    'Tuesday', 'Wednesday', 'Thursday' => '工作',
    'Friday' => '兴奋',
    'Saturday', 'Sunday' => '放松',
    default => '未知'
};

echo $mood; // "疲惫"
?>

Match 与 Switch 的区别

php
<?php
// Match 是表达式(返回值)
$result = match ($value) {
    1 => 'one',
    2 => 'two',
    default => 'other'
};

// Switch 是语句(不返回值)
switch ($value) {
    case 1:
        $result = 'one';
        break;
    case 2:
        $result = 'two';
        break;
    default:
        $result = 'other';
        break;
}

// Match 使用严格比较(===)
$input = '1';

$switchResult = match ($input) {
    1 => 'number one',      // 不会匹配(严格比较)
    '1' => 'string one',    // 会匹配
    default => 'other'
};

// Match 不会穿透
$value = 1;

$matchResult = match ($value) {
    1 => 'one',
    1 => 'uno',  // 这会导致错误(重复的 case)
};

// Match 可以有复杂表达式
$user = getCurrentUser();

$access = match (true) {
    $user === null => 'guest',
    $user->isAdmin() => 'admin',
    $user->isModerator() => 'moderator',
    $user->isActive() => 'user',
    default => 'inactive'
};
?>

三元运算符

基本三元运算符

php
<?php
$age = 20;

// 基本三元运算符
$status = ($age >= 18) ? '成年人' : '未成年人';
echo $status; // "成年人"

// 使用函数调用
$user = getCurrentUser();
$username = $user ? $user->getName() : '访客';

// 在字符串插值中使用三元运算符
$items = 5;
echo "您有 $items " . ($items === 1 ? '个物品' : '个物品');

// 用于默认值的三元运算符
$page = $_GET['page'] ?? null;
$currentPage = $page ? (int)$page : 1;
?>

嵌套三元运算符(谨慎使用)

php
<?php
$score = 85;

// 嵌套三元运算符(难以阅读)
$grade = ($score >= 90) ? 'A' : 
         (($score >= 80) ? 'B' : 
         (($score >= 70) ? 'C' : 
         (($score >= 60) ? 'D' : 'F')));

// 更好的方法
function getGrade($score) {
    if ($score >= 90) return 'A';
    if ($score >= 80) return 'B';
    if ($score >= 70) return 'C';
    if ($score >= 60) return 'D';
    return 'F';
}

$grade = getGrade($score);
?>

Elvis 运算符(PHP 5.3+)

php
<?php
// Elvis 运算符 ?: (简化三元运算符)
$username = $user->getName() ?: '匿名';

// 等价于:
$username = $user->getName() ? $user->getName() : '匿名';

// 用于默认值
$config = [
    'theme' => 'dark',
    'language' => 'en'
];

$theme = $config['theme'] ?: 'light';
$language = $config['language'] ?: 'en';
$timezone = $config['timezone'] ?: 'UTC';

// 小心假值
$count = 0;
$display = $count ?: '没有物品'; // "没有物品"(0是假值)

// 使用空合并运算符进行 null 检查
$display = $count ?? '没有物品'; // "0"(只有 null 才触发默认值)
?>

Practical Examples

User Authentication

php
<?php
function authenticateUser($username, $password) {
    if (empty($username) || empty($password)) {
        return ['success' => false, 'message' => 'Username and password required'];
    }
    
    $user = findUserByUsername($username);
    
    if (!$user) {
        return ['success' => false, 'message' => 'User not found'];
    }
    
    if (!$user->isActive()) {
        return ['success' => false, 'message' => 'Account is inactive'];
    }
    
    if (!password_verify($password, $user->getPasswordHash())) {
        return ['success' => false, 'message' => 'Invalid password'];
    }
    
    return ['success' => true, 'user' => $user];
}

// Usage
$result = authenticateUser($_POST['username'] ?? '', $_POST['password'] ?? '');

if ($result['success']) {
    $_SESSION['user_id'] = $result['user']->getId();
    header('Location: /dashboard');
} else {
    $error = $result['message'];
}
?>

Form Validation

php
<?php
function validateContactForm($data) {
    $errors = [];
    
    // Name validation
    if (empty($data['name'])) {
        $errors['name'] = 'Name is required';
    } elseif (strlen($data['name']) < 2) {
        $errors['name'] = 'Name must be at least 2 characters';
    }
    
    // Email validation
    if (empty($data['email'])) {
        $errors['email'] = 'Email is required';
    } elseif (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
        $errors['email'] = 'Invalid email format';
    }
    
    // Message validation
    if (empty($data['message'])) {
        $errors['message'] = 'Message is required';
    } elseif (strlen($data['message']) < 10) {
        $errors['message'] = 'Message must be at least 10 characters';
    }
    
    // Age validation (optional)
    if (!empty($data['age'])) {
        if (!is_numeric($data['age'])) {
            $errors['age'] = 'Age must be a number';
        } elseif ($data['age'] < 13) {
            $errors['age'] = 'Must be at least 13 years old';
        } elseif ($data['age'] > 120) {
            $errors['age'] = 'Invalid age';
        }
    }
    
    return $errors;
}

// Usage
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $errors = validateContactForm($_POST);
    
    if (empty($errors)) {
        // Process form
        sendContactEmail($_POST);
        $success = "Message sent successfully!";
    }
}
?>

Permission System

php
<?php
class PermissionChecker {
    private $user;
    
    public function __construct($user) {
        $this->user = $user;
    }
    
    public function canViewPage($page) {
        if (!$this->user) {
            return $page === 'home' || $page === 'login';
        }
        
        switch ($page) {
            case 'admin':
                return $this->user->hasRole('admin');
            case 'moderator':
                return $this->user->hasRole('admin') || $this->user->hasRole('moderator');
            case 'profile':
            case 'settings':
                return $this->user->isActive();
            case 'home':
            case 'about':
            case 'contact':
                return true;
            default:
                return false;
        }
    }
    
    public function canEditContent($content) {
        if (!$this->user || !$this->user->isActive()) {
            return false;
        }
        
        // Admin can edit everything
        if ($this->user->hasRole('admin')) {
            return true;
        }
        
        // Users can edit their own content
        if ($content->getAuthorId() === $this->user->getId()) {
            return true;
        }
        
        // Moderators can edit published content
        if ($this->user->hasRole('moderator') && $content->isPublished()) {
            return true;
        }
        
        return false;
    }
}

// Usage
$checker = new PermissionChecker($currentUser);

if ($checker->canViewPage('admin')) {
    showAdminPanel();
} else {
    showAccessDenied();
}
?>

API Response Handler

php
<?php
function handleApiResponse($response) {
    $statusCode = $response->getStatusCode();
    
    switch (true) {
        case ($statusCode >= 200 && $statusCode < 300):
            return [
                'success' => true,
                'data' => $response->getData(),
                'message' => 'Request successful'
            ];
            
        case ($statusCode === 400):
            return [
                'success' => false,
                'error' => 'Bad request',
                'message' => 'Please check your request parameters'
            ];
            
        case ($statusCode === 401):
            return [
                'success' => false,
                'error' => 'Unauthorized',
                'message' => 'Please log in to continue'
            ];
            
        case ($statusCode === 403):
            return [
                'success' => false,
                'error' => 'Forbidden',
                'message' => 'You do not have permission to access this resource'
            ];
            
        case ($statusCode === 404):
            return [
                'success' => false,
                'error' => 'Not found',
                'message' => 'The requested resource was not found'
            ];
            
        case ($statusCode >= 500):
            return [
                'success' => false,
                'error' => 'Server error',
                'message' => 'An internal server error occurred'
            ];
            
        default:
            return [
                'success' => false,
                'error' => 'Unknown error',
                'message' => "Unexpected status code: $statusCode"
            ];
    }
}
?>

Best Practices

Readability and Maintainability

php
<?php
// Good: Clear and readable
if ($user && $user->isActive() && $user->hasPermission('edit')) {
    allowEditing();
}

// Bad: Too complex in one line
if ($user && $user->isActive() && ($user->hasRole('admin') || ($user->hasRole('editor') && $user->getExperience() > 6)) && !$user->isSuspended()) {
    // Hard to understand
}

// Better: Break down complex conditions
$isActiveUser = $user && $user->isActive() && !$user->isSuspended();
$hasEditPermission = $user && ($user->hasRole('admin') || 
                              ($user->hasRole('editor') && $user->getExperience() > 6));

if ($isActiveUser && $hasEditPermission) {
    allowEditing();
}

// Use early returns to reduce nesting
function processOrder($order) {
    if (!$order) {
        return false;
    }
    
    if (!$order->isValid()) {
        return false;
    }
    
    if ($order->getTotal() <= 0) {
        return false;
    }
    
    // Process the order
    return true;
}
?>

Next Steps

Now that you understand conditional statements, let's explore loops in Loops.

Practice Exercises

  1. Create a grade calculator using if-elseif statements
  2. Build a simple router using switch statements
  3. Implement user role checking with match expressions
  4. Create a form validator with comprehensive error checking
  5. Build a permission system using nested conditions

Mastering conditional statements is essential for creating dynamic and responsive PHP applications!

本站内容仅供学习和研究使用。