逻辑运算符 #

一、逻辑运算符列表 #

运算符 名称 示例 说明
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 优先级顺序 #

从高到低:

  1. !
  2. &&、||
  3. =、+=、-= 等
  4. 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