在编程过程中,为了使语法看起来简明精炼,我们通常会用??和 && 或 || 等逻辑运算来代替if等多行写法,不过,使用的过程中对此理解不深刻,迟早会踩到一些坑,下面就以PHP举例来说一下相关要点。
问题一、php语句中??句式说明
在 PHP 中,双问号 (??) 是空合并运算符(Null Coalescing Operator)的语法。它用于判断一个变量是否为 null,如果是,则返回第一个不为 null 的表达式或变量,否则返回该变量本身。
其语法格式如下:
$variable ?? $value_if_null
其中,value_if_null 则是当 variable 不为 null,则直接返回 $variable 的值。
以下是一个使用空合并运算符的示例:
$name = $_GET['name'] ?? 'Guest';
echo 'Hello, '.$name;
在这个例子中,我们从 GET 请求参数中获取 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"。
需要注意的是,&& 和 || 的执行顺序是从左到右,如果需要改变优先级,可以使用圆括号将表达式包裹起来。
坑:ret = RedisUtil::get('cacheRet');这样写可以吗?
在 PHP 中,逻辑运算符 || 的优先级低于赋值运算符 =。因此,如果你想使用 $ret || $ret = RedisUtil::get('cacheRet'); 来实现“如果 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 变量。