使用三元运算符而不使用Else语句PHP


Using Ternary Operator without the Else statement PHP

您能在PHP中使用三元运算符而不使用关闭的'else'语句吗?我试过了,但它返回错误。谷歌搜索没有任何结果,所以我想答案可能是否定的。我只是想在这里仔细检查一下。例如:

if ( isset($testing) {
  $new_variable = $testing;
}

只有在$testing存在的情况下才会设置$new_variable。现在我可以做了

$new_variable = (isset($testing) ? $testing : "");

但如果未设置$testing,则会为$new_variable返回一个空变量。如果没有设置空变量,我不希望它,我希望不创建$new_variable。

我试过

$new_variable = (isset($testing) ? $testing);

并且它返回了错误。我也试过

$new_variable = (isset($testing) ? $testing : );

并且它还返回了错误。有没有一种方法可以在没有附加else语句的情况下使用三元运算符,或者我只能用手写出来?

编辑:根据Rizier123的建议,我尝试将等式的"else"部分设置为NULL,但它最终仍然会在数组中添加一个键。价值不在那里,但关键是,这打乱了我的计划。请允许我进一步解释。

该代码将从表单中获取一组$_POST变量,并将它们用于stdClass中的参数,然后用于API方法调用。一些表单变量将不存在,因为它们都应用于API调用的同一个变量,但用户只能选择一个。例如,您可以选择3个项目,无论选择哪一个项目,都会被传递到stdClass,而其他2个项目则不存在。

我试过这个:

$yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = (isset($yes_this_test) ? $yes_this_test : NULL);
$list->MaybeSet = (isset($testing) ? $testing : NULL);
print_r($list);

但很明显,MaybeSet被设置为NULL,因为(isset($testing)在(isset)($yes_this_test)之后,它返回

stdClass Object ( [DefinitelySet] => for sure [MaybeSet] => )

我不知道$_POST变量的顺序,所以我真的不能用这种方式来构建它,以确保列表以正确的顺序处理。

现在我知道我可以做一些类似的事情

if ( isset($yes_this_test ) {
  $list->MaybeSet = $yes_this_test;
}
elseif ( isset($testing) ) {
  $list->MaybeSet = $testing;
}

但我希望有一个这种逻辑的简写,因为我必须写几十个这样的逻辑。是否有类似于用于if/elseif语句的三元运算符的运算符?

由于PHP 5.3,您可以执行以下操作:

!isset($testing) ?: $new_variable = $testing;

正如您所看到的,它只在条件为false时使用该部分,因此您必须否定isset表达式。

更新

从PHP 7.0开始,你可以这样做:

$new_variable = $testing ?? null;

正如您所看到的,如果它存在并且不为NULL,它将返回其第一个操作数;否则返回第二个操作数。

更新

从PHP 7.4开始,你可以这样做:

$new_variable ??= $testing;

如果它是isset,则它单独留下$new_variable,否则将$testing分配给它。

只需将其设置为NULL,如下所示:

$new_variable = (isset($testing) ? $testing : NULL);

通过isset()检查,您的变量将返回false。

您可以在手册中阅读更多关于NULL的信息。

还有一句话:

特殊的NULL值表示一个没有值的变量。NULL是唯一可能的NULL类型的值。

一个变量被认为是null,如果:

  • 它被分配了常量NULL
  • 尚未将其设置为任何值
  • 它已被取消设置()

由于PHP 7.0,您可以执行以下操作,而不会获得ErrorException"试图获取非对象的属性"roomNumber"":

$house = new House();
$nr = $house->tenthFloor->roomNumbers ?? 0

假定属性";tenthFloor";不存在于类"中;House";,上面的代码不会抛出错误。而下面的代码将抛出ErrorException:

$nr = $house->tenthFloor->roomNumbers ? $house->tenthFloor->roomNumbers : 0

您也可以这样做(缩写):

isset($testing) ? $new_variable = $testing : NULL;

在短中写入语句时,仅使用NULL跳过语句

$a == $b? $a = 20 : NULL;