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