使用没有Else语句PHP的Ternary运算符

时间:2015-03-31 17:26:40

标签: php if-statement ternary-operator

你可以在PHP中使用三元运算符而无需关闭'否则'声明?我已经尝试了它并且它返回了错误。谷歌搜索不会产生任何结果,所以我认为答案可能是否定的。我只是想在这里仔细检查一下。例如:

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 : );

它也返回了错误。有没有办法在没有附加其他声明的情况下使用三元运算符,或者我是不是刻意写出来的?

编辑:按照Rizier123的建议,我尝试设置其他'其他'等式的一部分为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语句的三元运算符的运算符?

4 个答案:

答案 0 :(得分:24)

Since PHP 5.3你可以这样做:

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

如您所见,如果条件为 false ,它仅使用该部分,因此您必须否定isset表达式。

<强>更新

Since PHP 7.0你可以这样做:

$new_variable = $testing ?? null;

如您所见,它返回第一个操作数(如果存在且不为NULL);否则它返回第二个操作数。

答案 1 :(得分:8)

只需将其设置为NULL,就像这样:

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

you变量将通过isset()检查返回false。

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

从那里引用:

  

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

如果符合以下情况,则变量被视为null

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

答案 2 :(得分:1)

自PHP 7.0起,您可以执行以下操作,,但发生ErrorException“ 试图获取非对象的属性'roomNumber'”:

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

假设属性“ tenthFloor”在“房屋”类中不存在,则上面的代码将不会引发错误。 而下面的代码将引发ErrorException:

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

答案 3 :(得分:0)

您也可以这样做(简称):

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