PHP 三元运算符:if/else if/else with NULL, 0 and 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

到目前为止,结果有所不同,我仍在努力理解。有时输出是 'Valid',有时是 'Invalid',有时是“尚未验证”

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

在嵌套的三元语句两边加上括号,使输出更可靠:

$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 (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"

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

但是是的......如果你想让它工作,你应该在你的嵌套 if/else.

两边加上括号

不过我会认真考虑使用普通 if/else...如果不这样做,您的代码将变得无法维护...如果您需要向 [=16= 添加更多逻辑怎么办? ] 之后?如果有人在追踪错误时偶然发现这行代码怎么办?