【问题标题】:Strange ternary operator奇怪的三元运算符
【发布时间】:2013-03-04 15:41:49
【问题描述】:
<?php echo (isset($var)) ?: $var; ?>

这个语法正确吗?如果 $var 不会被设置,空字符串或 null 会显示什么?用这个可以吗?

【问题讨论】:

  • 我认为这没有意义。如果设置了$var,它会回显true,但如果没有设置$var,它会回显$var
  • 是否有任何快捷方式可以显示我想要的内容 - 未设置 $var 时为空?
  • 是的,有捷径,看我的回答。
  • echo (isset($var)?'YES':'NO');

标签: php


【解决方案1】:

这个:

<?php echo (isset($var)) ?: $var; ?>

做同样的事情:

<?php
 if (isset($var)) {
  // do nothing
 } else {
  echo $var;
 }
?>

因此,如果变量为空/null/等,则您正在尝试显示变量...

如果函数:

<?php $k= (cond ? do_if_true : do_if_false); ?>

$k 可以是新变量、echo
cond - isset$z==$y

【讨论】:

  • 这实际上不是真的。它在功能上等同于:echo isset($var) ? isset($var) : $var,这在技术上与您的示例不同。
  • ($var) ?: '' 会解决我所有的问题,尽管据我所知这不等同于 isset($var) ? $var : '',我说的对吗?
  • 我只是尝试运行您的示例,没有'',服务器没有显示任何结果,我收到错误syntax error, unexpected ':',所以可能有必要
【解决方案2】:

语法正确,用法不正确。在这里说:

$var = something();
echo $var ?: 'false';

这相当于:

$var = something();
if ($var) {
    echo $var;
} else {
    echo 'false';
}

$var ? $var : 'false'的简写。

您的示例毫无意义,因为如果设置了$var,则输出isset($var) (true) 的结果,否则输出$var

您需要echo isset($var) ? $var : nullif (isset($var)) echo $var,但没有捷径可走。

【讨论】:

    【解决方案3】:

    语法很好。

    如果设置了$var,那么它会输出,如果没有,它会抛出一个关于未设置的$var回显的通知。

    如果您的 error_reporting 设置为 E_NONE,那么您只会看到一个白屏,如果设置了 $var,那么您将看到 $var 的值

    【讨论】:

      【解决方案4】:

      无论哪种方式,这都会回显 $var。

      从 PHP 5.3 开始,可以省略中间部分 三元运算符。表达式 expr1 ?: expr3 如果 expr1 返回 expr1 计算结果为 TRUE,否则为 expr3。

      因此,如果设置了 $var,它会回显 $var(因为它的计算结果为 TRUE),如果它没有设置为任何值或计算结果为 false,则您手动要求它回显 $var。

      理想情况下:

      (condition  ?  if_true_then_do_this : if_false_then_do_this)
      

      简而言之,这变成了

         (condition ? ? false)
      

      并且由于您在两个地方都指定了 $var,因此无论哪种方式,您都会得到 $var。你想要这个:

      echo ($var?:"null");
      

      【讨论】:

      • 如果 $var 不会被设置,这不会生成一个通知吗?
      • 不,它会回显 null。我刚刚创建了一个包含那一行的测试脚本,并将 null 打印到屏幕上。
      • 如果我设置 $var = 5;或类似的东西,它会打印出 $var 的值。
      • 那么就是说 if(isset($var)) 和 if($var) 完全一样?我一直想知道这样做是否可以:D
      【解决方案5】:

      不,这个语法不正确。
      在回显时,必须设置所有变量并正确格式化
      否则意味着开发人员不知道他们的变量来自哪里以及它们包含什么 - 一条直接的注入之路。

      所以,正确的语法应该是

      <?=$var?>
      

      至于三元组 - 我不喜欢它们。

      【讨论】:

      • 为了获得技术 - 语法是正确的。逻辑不是。
      【解决方案6】:

      代码没有意义,生成通知或回显 1,您无法打印未设置的 $var

      【讨论】:

      • “不是 isset” 真的吗?真的?! ಠ_ಠ
      • 已更正:P,我不是英语,你也不能随意输入-1
      【解决方案7】:
      <?php (isset($var)) ? echo "" : echo $var; ?>
      

      你可以用这个。

      【讨论】:

      • 如果设置了 $var 则回显空字符串,如果未设置则回显 $var??什么?
      • @Sam 这是 OP 的逻辑错误。 ¯\_(ツ)_/¯
      猜你喜欢
      • 1970-01-01
      • 2013-10-29
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2017-05-28
      相关资源
      最近更新 更多