【问题标题】:understading the ternary operator in php理解php中的三元运算符
【发布时间】:2014-01-11 21:45:04
【问题描述】:

我正在阅读别人的代码,他们有这样的一行:

  $_REQUEST[LINKEDIN::_GET_TYPE] = (isset($_REQUEST[LINKEDIN::_GET_TYPE])) ? $_REQUEST[LINKEDIN::_GET_TYPE] : '';

我只是想确保我遵循这一点。我可能终于弄清楚了它的逻辑。

这是正确的吗?

如果设置了$_REQUEST[LINKEDIN::_GET_TYPE],则将其分配给自身。 (意味着什么都不做的条件)否则将其设置为空字符串。 (这意味着 NULL(未定义)和 "" 在脚本的其他部分不会被同等对待。)

【问题讨论】:

  • 这会比if (!isset($_REQUEST[LINKEDIN::_GET_TYPE])) $_REQUEST[LINKEDIN::_GET_TYPE] = ''; 好得多,如果只是因为这种冗余的落后方式会产生这样的问题。
  • 设置为空字符串,不是空字符串。
  • @deceze,这正是我的想法。冗余和倒退!谢谢。
  • 当我说“空字符串”时,我的意思是“”。但我会尽量在措辞上更加小心。

标签: php logic ternary-operator


【解决方案1】:

据我所知,您的解释是正确的。

三元运算符类似于 if 语句。你的 if 语句看起来像这样:

if( isset($_REQUEST[LINKEDIN::_GET_TYPE] ) {
    $_REQUEST['LINKEDIN::_GET_TYPE] = $_REQUEST['LINKEDIN::_GET_TYPE];
} else {
    $_REQUEST['LINKEDIN::_GET_TYPE] = ''; // It equals an empty string, not null.
}

如果您不确定发生了什么,有时像普通 if 语句一样查看三元语句更容易。

您的语句似乎在做您所说的,如果设置了值,则将其设置为自身,如果未设置,则将其设置为空字符串。

【讨论】:

    【解决方案2】:

    这个

    $foo = $bar ? 'baz' : 'qux';
    

    是功能上的等价物

    if ($bar) { // test $bar for truthiness
       $foo = 'baz';
    } else {
       $foo = 'qux';
    }
    

    所以是的,你正在做的事情会奏效。但是,对于较新的 PHP 版本,有一个快捷版本的 tenary:

    $foo = $bar ?: 'qux';
    

    这将完全符合您的要求

    【讨论】:

      【解决方案3】:

      这样想

      if(condition) { (?)
         //TRUE
      } else { (:)
         //FALSE
      }
      

      所以,

      echo condition ? TRUE : FALSE;
      

      如果有道理

      【讨论】:

        【解决方案4】:

        您发布的三元运算符就像一行if-else 如下

        if (isset($_REQUEST[LINKEDIN::_GET_TYPE])) {
          $_REQUEST[LINKEDIN::_GET_TYPE] = $_REQUEST[LINKEDIN::_GET_TYPE];
        } else {
          $_REQUEST[LINKEDIN::_GET_TYPE] = '';
        }
        

        你可以简化为

        if (!(isset($_REQUEST[LINKEDIN::_GET_TYPE]))) {
          $_REQUEST[LINKEDIN::_GET_TYPE] = '';
        }
        

        【讨论】:

        • 请注意,如果您已经知道数组项是否存在:$something = $_REQUEST[LINKEDIN::_GET_TYPE] ?: ''; 就足够了(速记三元)
        • 我认为让我感到困惑的是,我理解它是在说 $_REQUEST[LINKEDIN::_GET_TYPE] = $_REQUEST[LINKEDIN::_GET_TYPE];,但为什么不明白为什么,但后来我想这可能意味着什么都不做。这会和这个一样吗? if (!isset($_REQUEST[LINKEDIN::_GET_TYPE])) { $_REQUEST[LINKEDIN::_GET_TYPE] = ''; }
        • @TecBrat 那是简化的形式,是的,它是等价的。
        【解决方案5】:

        你错过了最后一部分。如果未设置 $_REQUEST[LINKEDIN::_GET_TYPE],则将 $_REQUEST[LINKEDIN::_GET_TYPE] 设置为空,而不是 null。关键是当$_REQUEST[LINKEDIN::_GET_TYPE]被调用时,它存在但没有价值。

        【讨论】:

          猜你喜欢
          • 2016-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-03
          • 1970-01-01
          • 1970-01-01
          • 2012-12-19
          相关资源
          最近更新 更多