【问题标题】:PHP: is there a difference between (isset($a) && !empty($a)) and $a??false [duplicate]PHP: (isset($a) && !empty($a)) 和 $a??false [重复]
【发布时间】:2022-01-26 11:35:55
【问题描述】:

我继承了一个代码库,该代码库使用诸如 (isset($a) && !empty($a)) 之类的术语填充了条件,但 $a 实际上是长变量名,令人眼花缭乱。我想用$a??false 替换表达式,但我不确定是否存在不一样的情况。

这些语句是相同的还是 $a 的某些值会不同?

【问题讨论】:

  • isset($a) && !empty($a) 是冗余。只需!empty($a)。

标签: php


【解决方案1】:

首先,让我们了解不同的元素在做什么:

  • isset 接受一个变量、数组元素等,如果它存在并且具有任何除 null 以外的值,则返回 true
  • empty 接受一个变量、数组元素等,如果它存在,则返回 false,并且 具有任何被视为等同于 true
  • ?? 检查一个变量、数组元素等,如果它存在并且具有除 null 以外的任何值,则返回其值;否则,它返回它的右手参数
  • if 语句中使用的任何表达式都会自动转换为布尔值

所以,我们可以看看等价:

  • empty 是 isset() 和强制转换为 false 的组合;具体来说,empty($a) === !isset($a) || !(bool)$a,所以!empty($a) === isset($a) && (bool)$a
  • ?? 使用与isset 相同的检查,而不是与empty 相同的检查;所以 $a ?? false 本身就相当于 isset($a) ? $a : false
  • 但是,在if 语句中,整个事情将被强制为布尔值,所以if ( $a ?? false ) ... 相当于if ( (bool)(isset($a) ? $a : false) ) ... 或更易读的if ( isset($a) ? (bool)$a : false ) ...

这给我们带来了答案,那就是以下都做同样的事情:

if ( isset($a) && !empty($a) ) ...
if ( isset($a) && !(bool)$a ) ... // empty() is just a bool cast + isset
if ( !empty($a) ) ... // the isset is actually redundant
if ( isset($a) ? (bool)$a : false ) ... // same logic as the && version
if ( (bool)($a ?? false) ) ... // ?? does the isset for us
if ( $a ?? false ) ... // if does the (bool) for us

可能最易读的方法就是单独使用!empty($a),并将?? 留给您实际需要原始值的地方,而不是true。

【讨论】:

  • 只要注意if ( !empty($a) )等价于if ( $a ),前提是可以证明变量$a存在于当前作用域中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多