忽略三元条件下的通知


Ignore notices in ternary conditions

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

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

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

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

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

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

但我想问的是,有没有办法从速记三元条件中获益,同时仍然避免对未定义变量的压制通知。

只需在前面加上@

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

无论如何,我建议改为与isset核实:

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

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

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

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

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

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

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

这可以工作:

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