条件语句
概述
条件语句允许您的程序根据特定条件做出决策并执行不同的代码路径。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
- Create a grade calculator using if-elseif statements
- Build a simple router using switch statements
- Implement user role checking with match expressions
- Create a form validator with comprehensive error checking
- Build a permission system using nested conditions
Mastering conditional statements is essential for creating dynamic and responsive PHP applications!