【问题标题】:Get value of variable when isset() is used in PHP ternary shorthand operatorPHP三元速记运算符中使用isset()时获取变量值
【发布时间】:2016-02-13 01:46:20
【问题描述】:

在使用较短的三元运算符时:

$foo = isset($_GET['bar']) ?: 'hello';

如果设置了$_GET['bar']$foo 是否可以返回$_GET['bar'] 的值而不是true

编辑:我理解老派三元的作品,例如,

$foo = isset($_GET['bar']) ? $_GET['bar'] : 'hello';

但我想使用更短版本的 newschool 三元组

【问题讨论】:

  • 有趣的是,很少有答案与您的示例相同

标签: php syntax operators ternary-operator php-7


【解决方案1】:

听起来您在询问新的(自 PHP 7 起)null coalesce operator。您可以执行以下操作:

$foo = $_GET['bar'] ?? 'hello';
echo $foo;

如果$_GET['bar'] 为空,则将$foo 设置为hello

存在且不为 NULL 的从左到右的第一个操作数。如果未定义任何值且不为 NULL,则为 NULL。自 PHP 7 起可用。

功能演示:https://3v4l.org/0CfbE

$foo = $_GET['bar'] ?? 'hello';
echo $foo . "\n";
$_GET['bar'] = 'good bye';
$foo = $_GET['bar'] ?? 'hello';
echo $foo;

输出:

hello
good bye

补充阅读:http://www.lornajane.net/posts/2015/new-in-php-7-null-coalesce-operator

【讨论】:

  • 是的,可能就是这样,但是这个新的运算符不再需要isset() 了吗?意思是,如果没有设置$_GET['bar'],它不会返回警告?
  • 根据此文档,不会发出通知,The coalesce, or ??, operator is added, which returns the result of its first operand if it exists and is not NULL, or else its second operand. This means the $_GET['mykey'] ?? "" is completely safe and will not raise an E_NOTICE.wiki.php.net/rfc/isset_ternary 所以不需要isset。如果您需要它来处理较旧的 PHP 部署,但它不会。
  • 谢谢,现在,我想出了一个让它工作的方法 $foo = filter_input(INPUT_GET, 'bar) ?: 'hello'; 虽然这看起来很“普通”
【解决方案2】:

是的,你会这样做

$foo = isset($_GET['bar']) ? $_GET['bar'] : 'hello';

【讨论】:

  • 好吧,但这不再是速记了
  • 是的,这就是这个条件运算符的工作方式。 if true 值放在冒号之前,if false 放在冒号之后。
【解决方案3】:

类似这样的:

$foo = isset($_GET['bar']) ? $_GET['bar'] : 'hello';

【讨论】:

    【解决方案4】:

    我不确定我是否理解您的问题,但是否类似于:

    $foo = isset($_GET['bar']) ? true : 'hello';
    

    如果设置了该变量,这将为您提供一个(true),如果没有设置,则为您好。

    【讨论】:

      【解决方案5】:

      答案是否定的(至少在 PHP5 中,请参见 chris 对 PHP7 的回答)。出于这个原因,我倾向于使用辅助函数,例如

      function isset_or(&$variable, $default = NULL)
      {
          return isset($variable) ? $variable : $default;
      }
      

      $foo = isset_or($_GET['bar'], 'hello');

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-16
        • 2012-02-11
        • 2011-09-10
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多