PHP三元运算符:if/else-if/else带NULL、0和1


PHP ternary operators: if/else if/else with NULL, 0 and 1

我试图简化这个控制块:

if (!isset($mobileNumberHF['IS_VALID']) && $mobileNumberHF['IS_VALID'] != 0) {
  echo '<strong class="text-warning">Sin validar</strong>';
} else if ($mobileNumberHF['IS_VALID'] == 0) {
  echo '<strong class="text-danger">Inválido</strong>';
} else {
  echo '<strong class="text-success">Validado</strong>';
}

像这样:

$isValidMobileNum = $mobileNumHF['IS_VALID'];
$mobileNumStatusLabel = ($isValidMobileNum == 1) ? 'Valid' : (!isset($isValidMobileNum)) ? 'Hasn't been validated' : 'Invalid';

测试场景是当$isValidMobileNum等于NULL, 0 or 1时;

到目前为止,结果在某种程度上有所不同,我仍在努力理解。有时输出为"有效"、有时为"无效",有时为"尚未验证"

例如,对于$isValidMobileNum = 1,我得到的是Invalid

这似乎不是一个正确的逻辑
我想,我应该如下:

if (isset($mobileNumberHF['IS_VALID'])) {
  echo ($mobileNumberHF['IS_VALID'] != 0)? '<strong class="text-success">Validado</strong>' : '<strong class="text-danger">Inválido</strong>';
} else {
  echo '<strong class="text-warning">Sin validar</strong>';  
}

至于三元运算符:您在最后一个操作数中放错了括号。此外,'Hasn't单词也有未标注的单引号。

$isValidMobileNum = 1;
$mobileNumStatusLabel = ($isValidMobileNum == 1) ? 'Valid' : (!isset($isValidMobileNum) ? 'Hasn''t been validated' : 'Invalid');
echo $mobileNumStatusLabel; // "Valid"

在嵌套的三元语句周围加括号,使输出更加可靠:

$isValidMobileNum = $mobileNumHF['IS_VALID'];
$mobileNumStatusLabel = ($isValidMobileNum == 1) ? 'Valid' : ( (!isset($isValidMobileNum)) ? 'Hasn't been validated' : 'Invalid' );

这是一个我个人会使用的替代方案(几乎没有理由说明为什么它更好)

$mobilePhone = isset($mobileNumHF['IS_VALID']) ? $mobileNumHF['IS_VALID'] : -1;
$mobileNumStatusLabel = $mobilePhone ? 'Valid' : ($mobilePhone == 0 ? 'Invalid' : 'Hasn''t been validated');

这样可以避免出现非法偏移警告。

为什么要对这个逻辑使用简写语法?我的意思是。。。很明显,你已经对if-else语句的作用感到困惑了。它是如何简化的?嵌套简写if/else语句。。。现在这叫简化吗?对我来说,这看起来就像你在创造一个怪物,因为你想写更少的代码行。这不是简化,而是杂耍。

但是是的。。。如果你想让它发挥作用,你应该在嵌套的If/else周围加上括号。

我会认真考虑使用normalif/else。。。如果你不这样做,你的代码将变得不可能维护。。。如果以后需要为if/else添加更多逻辑,该怎么办?如果有人在追踪bug时偶然发现了这行代码,该怎么办?