编程语句中的??、&&、||运算符技巧应用及坑

246 阅读2分钟

在编程过程中,为了使语法看起来简明精炼,我们通常会用??和 && 或 || 等逻辑运算来代替if等多行写法,不过,使用的过程中对此理解不深刻,迟早会踩到一些坑,下面就以PHP举例来说一下相关要点。

问题一、php语句中??句式说明

在 PHP 中,双问号 (??) 是空合并运算符(Null Coalescing Operator)的语法。它用于判断一个变量是否为 null,如果是,则返回第一个不为 null 的表达式或变量,否则返回该变量本身。

其语法格式如下:

$variable ?? $value_if_null

其中,variable为需要判断的变量,variable 为需要判断的变量,value_if_null 则是当 variablenull时需要返回的值。如果variable 为 null 时需要返回的值。如果 variable 不为 null,则直接返回 $variable 的值。

以下是一个使用空合并运算符的示例:

$name = $_GET['name'] ?? 'Guest';
echo 'Hello, '.$name;

在这个例子中,我们从 GET 请求参数中获取 name 值。如果该值存在,则将其赋值给 name变量;否则,name 变量;否则,name 将被赋值为 'Guest'。

坑:那如果第一个结果是false 能用上面语句吗?

如果变量的值为 false,空合并运算符(??) 也会将其视为有效的值。因此,如果要在使用空合并运算符时考虑到false值,可以使用以下语法格式:

$variable !== null ? $variable : $value_if_null

其中,!== 运算符用于判断 $variable 是否为 null,如果不是则返回 $variable 的值,否则返回 $value_if_null

示例代码:

$value = false;
$result = $value !== null ? $value : 'default value';
echo $result; // 输出 false

需要注意的是,在上述代码中,空合并运算符不能正确地处理 $value 的值为 false 的情况,因为它会将 $value 视为有效的值。如果希望 false 被视为无效值,则应该使用上面提到的三目运算符来进行判断。

问题二、&& 和 || 呢?

在 PHP 中,&&|| 是逻辑运算符,分别代表“与”和“或”关系。它们用于将多个条件组合起来进行判断。

&& 运算符表示“并且”,只有当左右两边的条件都为 true 时,整个表达式才为 true

示例代码:

$a = true;
$b = false;
if ($a && $b) {
    echo 'Both conditions are true';
} else {
    echo 'At least one condition is false';
}

在上面的代码中,因为 $b 的值为 false,所以 $a && $b 的结果为 false,最终输出的是 "At least one condition is false"。

|| 运算符表示“或者”,只要左右两边的条件中有任意一个为 true,整个表达式就为 true

示例代码:

$x = true;
$y = false;
if ($x || $y) {
    echo 'At least one condition is true';
} else {
    echo 'Both conditions are false';
}

在上面的代码中,因为 $x 的值为 true,所以 $x || $y 的结果为 true,最终输出的是 "At least one condition is true"。

需要注意的是,&&|| 的执行顺序是从左到右,如果需要改变优先级,可以使用圆括号将表达式包裹起来。

坑:retret || ret = RedisUtil::get('cacheRet');这样写可以吗?

在 PHP 中,逻辑运算符 || 的优先级低于赋值运算符 =。因此,如果你想使用 $ret || $ret = RedisUtil::get('cacheRet'); 来实现“如果 ret为空,则使用Redis获取数据并赋值给ret 为空,则使用 Redis 获取数据并赋值给 ret”的逻辑,可能无法达到预期的效果。

例如,如果 $ret 的值为 false,代码的执行顺序会是先执行$ret = RedisUtil::get('cacheRet'),再将 $ret 赋值为 false,最终返回 false

如果要正确地实现上述逻辑,请使用括号来控制表达式的优先级,如下所示:

$ret = $ret ?: RedisUtil::get('cacheRet');

或者:

$ret = $ret ?? RedisUtil::get('cacheRet');

这样可以保证先判断 $ret 是否为空,为空时才会执行 RedisUtil::get() 方法来获取数据并赋值给 $ret 变量。

同样的,在 PHP 中,逻辑运算符 && 的优先级也低于赋值运算符 =,与逻辑运算符 || 一样。因此,如果你使用 $a && $a = $b; 这样的语句,可能得到意想不到的结果。

例如,如果 $a 的值为 false,代码的执行顺序会是先执行 $a = $b,再将 $a 赋值为 false,最终返回 false

如果要正确地实现上述逻辑,请使用括号来控制表达式的优先级,如下所示:

$a = $a && $b;

这样可以保证先计算 $a && $b 的结果,再将结果赋值给 $a 变量。