【问题标题】:Using Ternary Operator without the Else statement PHP在没有 Else 语句 PHP 的情况下使用三元运算符
【发布时间】:2015-06-05 03:39:57
【问题描述】:

你可以在 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 语句的三元运算符的运算符?

【问题讨论】:

  • 另一种选择是使用不带花括号的 if 语句。它也可以在类似于三元的一行上。 if(isset($testing)) $new_variable = $testing;。 IMO 我不喜欢没有花括号,但只是说这是可能的。 IMO 最好像 Rizier 建议的那样将其设置为 NULL,因为如果值为 NULL,则 isset 将返回 false。 isset($nullVar) 将返回 false。

标签: php if-statement ternary-operator


【解决方案1】:

Since PHP 5.3你可以这样做:

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

如你所见,它只使用条件为false的部分,所以你必须否定isset表达式。

更新

Since PHP 7.0你可以这样做:

$new_variable = $testing ?? null;

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

更新

Since PHP 7.4你可以这样做:

$new_variable ??= $testing;

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

【讨论】:

  • PHP 允许在 "truthy" 槽中使用空值但不允许在 "falsey" 槽中存在空值这一事实是荒谬的。 PHP 语言维护者的脑子里在想什么? !isset($testing) ? : $new_variable = $testing; 但不是!isset($testing) ? $new_variable = $testing;
  • @ahnbizcad 这不是一个实际的空值,只是使用第一个操作数的语法糖。如果第三个操作数被省略,我同意有一个使用 null 的等价物会很好,但这可能需要一个新的运算符。
  • 也许语法糖很烂,实际上是语法阿斯巴甜。
【解决方案2】:

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

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

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

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

还有一段话:

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

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

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

【讨论】:

  • 完美!谢谢你。我一直认为 NULL 与空几乎相同。我想我应该少假设,多读书。 ;)
  • 呸,其实刚才测试了一下,还是把变量追加到了一个列表中,就像一个空变量一样。我不知道这是否可行,因为我将不得不将它用于使用 $_POST 变量作为参数的参数数组。我不知道 $_POST 变量将以什么顺序通过,因此即使设置了 $_POST 变量之一,我也可能会得到一个 NULL 参数。我会在上面进一步解释。
  • @Longblog 是的,只需编辑您的问题并将其放入其中,以便我明白您的意思
  • 好的,我已经添加了其他详细信息以及示例。感谢您的帮助。
  • @Longblog 只需在末尾添加:$list = (object) array_filter((array)$list, function ($v){ return !is_null($v); }); 这将删除所有值为 NULL 的值。问题是这是在一个类中,所以它就像一个没有值的已定义属性
【解决方案3】:

从 PHP 7.0 开始,您可以执行以下操作,不会收到 ErrorException "尝试获取非对象的属性 'roomNumber'":

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

假设“House”类中不存在“tenthFloor”属性,上述代码不会抛出错误。 而下面的代码会抛出一个ErrorException:

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

【讨论】:

    【解决方案4】:

    您也可以这样做(短格式):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2013-04-28
      • 2017-11-19
      • 1970-01-01
      • 2013-12-01
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多