逻辑运算符 #
一、逻辑运算符列表 #
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| and | 与 | $a and $b | 两者都为true |
| && | 与 | $a && $b | 两者都为true(优先级高) |
| or | 或 | $a or $b | 任一为true |
| || | 或 | $a || $b | 任一为true(优先级高) |
| xor | 异或 | $a xor $b | 仅一个为true |
| ! | 非 | !$a | 取反 |
二、与运算(AND) #
2.1 && 运算符 #
php
<?php
var_dump(true && true);
var_dump(true && false);
var_dump(false && true);
var_dump(false && false);
2.2 and 运算符 #
php
<?php
var_dump(true and true);
var_dump(true and false);
2.3 && 与 and 的区别 #
优先级不同,&& 优先级高于 and:
php
<?php
$a = true && false;
$b = true and false;
var_dump($a);
var_dump($b);
2.4 真值表 #
| $a | $b | $a && $b |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
三、或运算(OR) #
3.1 || 运算符 #
php
<?php
var_dump(true || true);
var_dump(true || false);
var_dump(false || true);
var_dump(false || false);
3.2 or 运算符 #
php
<?php
var_dump(true or false);
var_dump(false or false);
3.3 || 与 or 的区别 #
php
<?php
$a = false || true;
$b = false or true;
var_dump($a);
var_dump($b);
3.4 真值表 #
| $a | $b | $a || $b |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
四、非运算(NOT) #
php
<?php
var_dump(!true);
var_dump(!false);
var_dump(!0);
var_dump(!1);
var_dump(!"");
var_dump(!"hello");
五、异或运算(XOR) #
php
<?php
var_dump(true xor true);
var_dump(true xor false);
var_dump(false xor true);
var_dump(false xor false);
5.1 真值表 #
| $a | $b | $a xor $b |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
六、短路求值 #
6.1 && 短路 #
如果第一个为false,不再计算第二个:
php
<?php
function expensiveOperation(): bool
{
echo "执行耗时操作\n";
return true;
}
$result = false && expensiveOperation();
$result = true && expensiveOperation();
6.2 || 短路 #
如果第一个为true,不再计算第二个:
php
<?php
$result = true || expensiveOperation();
$result = false || expensiveOperation();
6.3 实际应用 #
默认值设置:
php
<?php
$name = $inputName || "Guest";
$name = $inputName ?: "Guest";
$name = $inputName ?? "Guest";
条件执行:
php
<?php
$loggedIn && redirectToDashboard();
$isAdmin || throw new Exception("无权限");
错误处理:
php
<?php
$file = fopen("data.txt", "r") or die("无法打开文件");
七、运算符优先级 #
7.1 优先级顺序 #
从高到低:
- !
- &&、||
- =、+=、-= 等
- and、or、xor
7.2 示例 #
php
<?php
$a = false;
$b = true;
$c = false;
$result = $a || $b && $c;
var_dump($result);
$result = ($a || $b) && $c;
var_dump($result);
7.3 使用括号明确优先级 #
php
<?php
if (($a && $b) || ($c && $d)) {
}
if ($a && ($b || $c)) {
}
八、实际应用 #
8.1 条件验证 #
php
<?php
function validateUser(string $username, string $password): bool
{
return strlen($username) >= 3
&& strlen($password) >= 8
&& preg_match('/[A-Z]/', $password)
&& preg_match('/[0-9]/', $password);
}
8.2 权限检查 #
php
<?php
function canAccess(User $user, Resource $resource): bool
{
return $user->isAdmin()
|| $user->isOwner($resource)
|| $user->hasPermission('read', $resource);
}
8.3 数据过滤 #
php
<?php
function filterItems(array $items, array $filters): array
{
return array_filter($items, function($item) use ($filters) {
return (!isset($filters['status']) || $item['status'] === $filters['status'])
&& (!isset($filters['category']) || $item['category'] === $filters['category'])
&& (!isset($filters['minPrice']) || $item['price'] >= $filters['minPrice']);
});
}
8.4 表单验证 #
php
<?php
function validateForm(array $data): array
{
$errors = [];
empty($data['name']) && $errors[] = "姓名不能为空";
empty($data['email']) && $errors[] = "邮箱不能为空";
!filter_var($data['email'], FILTER_VALIDATE_EMAIL) && $errors[] = "邮箱格式不正确";
strlen($data['password']) < 8 && $errors[] = "密码至少8位";
return $errors;
}
九、位运算与逻辑运算 #
9.1 位运算符 #
| 运算符 | 名称 | 示例 |
|---|---|---|
| & | 按位与 | $a & $b |
| | | 按位或 | $a | $b |
| ^ | 按位异或 | $a ^ $b |
| ~ | 按位取反 | ~$a |
| << | 左移 | $a << $n |
| >> | 右移 | $a >> $n |
9.2 位运算示例 #
php
<?php
$a = 5;
$b = 3;
echo $a & $b;
echo $a | $b;
echo $a ^ $b;
echo ~$a;
echo $a << 1;
echo $a >> 1;
9.3 标志位使用 #
php
<?php
const READ = 1;
const WRITE = 2;
const EXECUTE = 4;
$permission = READ | WRITE;
if ($permission & READ) {
echo "可读";
}
if ($permission & WRITE) {
echo "可写";
}
if ($permission & EXECUTE) {
echo "可执行";
}
十、最佳实践 #
10.1 使用括号明确意图 #
php
<?php
if (($a && $b) || ($c && $d)) {
}
10.2 避免复杂表达式 #
php
<?php
$condition1 = $a && $b;
$condition2 = $c && $d;
if ($condition1 || $condition2) {
}
10.3 使用严格比较 #
php
<?php
if ($value !== null && $value > 0) {
}
if ($value === null || $value === '') {
}
10.4 提前返回 #
php
<?php
function process(?User $user, ?Order $order): bool
{
if ($user === null || $order === null) {
return false;
}
if (!$user->isActive() || $order->isExpired()) {
return false;
}
return true;
}
十一、总结 #
本章学习了:
- 与运算:&& 和 and
- 或运算:|| 和 or
- 非运算:!
- 异或运算:xor
- 短路求值机制
- 运算符优先级
- 位运算符
下一章将学习赋值运算符。
最后更新:2026-03-26