【问题标题】:Ignore notices in ternary conditions忽略三元条件下的通知
【发布时间】:2017-04-01 08:26:01
【问题描述】:

我想知道是否可以选择性地在哪个上下文中忽略未定义的变量。对于三元条件,我喜欢可以快速为未定义设置设置默认值的想法,如下所示:

$date = $_POST['date'] ?: date();

要使用它,我必须忽略 E_NOTICE 错误。

但是,我真的不喜欢忽略所有未定义的变量,并且不小心使用未定义的变量而被忽视的想法。所以我想知道这种情况是否有一些中间立场的可能性?

澄清一下,我知道非三元解决方案,例如

$date = (isset($_POST['date'])) ? $_POST['date'] : date();
// or
$date = date(); 
if(isset($_POST['date'])) {
   $date = $_POST['date'];
}

但我想问的是,有没有办法获得速记三元条件的好处,同时仍然避免抑制未定义变量的通知。

【问题讨论】:

  • 您应该始终构建代码以考虑通知/警告/错误,而不是抑制或忽略它们。我猜你正在寻找类似$date = isset($_POST['date']) ? $_POST['date'] : date(); 的东西?如果设置了 POST,则使用它,如果没有使用 date()?

标签: php ternary-operator


【解决方案1】:

这可以工作:

$date = ! empty($_POST['date']) ? $_POST['date'] : date();

【讨论】:

    【解决方案2】:

    只需在前面加上@:

    $date = @$_POST['date'] ?: date('Y-m-d');
            ^
    

    无论如何,我建议改为使用isset 进行验证:

    $date = isset($_POST['date']) ? $_POST['date'] : date('Y-m-d');
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 PHP 7+,那么您可以使用 the null coalescing operator, ?? - 它不会引发关于未设置变量的通知。它还显式检查 null 而不是空变量 - ?: 不会直观地用于零或空字符串等。

      // Raises a notice if $_POST['date'] isn't set
      $_POST['date'] ?: date();
      
      // Won't raise a notice
      $_POST['date'] ?? date();
      

      顺便说一句,您可能指的是time() 而不是date(),因为后者需要格式参数。或者您可能只是将其排除在示例之外。

      【讨论】:

      • 不用担心 date(),这只是我直接在 Stackoverflow 上写的一个例子,所以我没有“深思熟虑”.. :P
      【解决方案4】:
      @iainn said:
      // Raises a notice if $_POST['date'] isn't set
      $_POST['date'] ?: date();
      // Won't raise a notice
      $_POST['date'] ?? date();
      

      请注意这 2 种形式是不等价的,这可能会暴露一个非常烦人的错误,以便将来发现。虽然三元运算符 (?:) 也检查空字符串,但合并运算符 (??) 不会!因此,在示例中:

      // if $_POST['date'] contains '';
      $_POST['date'] ?? date(); # it prints '' instead of date()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 2011-01-27
        • 2021-11-18
        相关资源
        最近更新 更多