【问题标题】:PHP Multiple actions in true clause in shorthand IFPHP 速记 IF 中的 true 子句中的多个动作
【发布时间】:2013-06-28 16:25:10
【问题描述】:

很确定有一个简单的答案,但由于使用了模糊的术语而难以搜索。

我正在使用简写 if 语句,并且想要在它返回 true 时执行多个操作,语法是什么样的?

例如,逻辑上认为我尝试了类似的方法:

<?php

$var = "whatever";

(isset($var) ? $var2=$var; $var3=$var : $error="fubar");

?>

显然这会以意想不到的方式停止;但希望你能明白我想要完成的工作。

很抱歉,如果这是一个重复的问题,我发誓我已经搜索过了。 :)

谢谢!

编辑

我理解速记是否适合这种情况应该受到质疑。但是,能不能做到,这是个问题。

【问题讨论】:

  • 我认为这不可能。我认为你只需要这样做 if (...) { ... } else { ... }
  • $var1 = $var2 = $var3 = (isset($var) ? $var : $error = 'foobar');
  • 当您开始将三元组组合在一起时,您的代码只是提交了一个无法读取的 WTF。
  • 不,不是,CodeAngry。这是一个赌注的来源,我赢了。 :) 但是这里的每个人都欣赏你的乐观。 kthx!

标签: php conditional-operator shorthand-if


【解决方案1】:

是的,可以在每次分配之间使用&amp;&amp;

(isset($var) ? ($var2=$var) && ($var3=$var) : $error="fubar");

以上代码中,如果设置了$var$var2$var3会得到相同的值,否则这两个变量不会改变。

也就是说,这不是最合适的方法。三元运算符应该用于简单的逻辑,当逻辑开始变得复杂时,三元运算符很可能不再是最佳选择。相反,您应该只使用简单的 if/else。

【讨论】:

  • 在这种特殊情况下,您甚至可以这样做:isset($var) ? $var2 = $var3 = $var : $error = 'foobar';
  • hum... 如果 $var == false,&& 运算符的第二部分将不会执行,对吧?否则,它有效,但它伤害了我的眼睛 x_x。
  • -1 如果$var 为假,&amp;&amp; 和以下将不会执行。这是您需要使用if...else 的时候。停止回答奇怪的问题,引导他们以正确的方式去做,而不是像海报想象的那样。
【解决方案2】:

对于这个特定的实例,您可以这样做:

在这个特定的例子中,你可以使用这个:

$output = (isset($var)) ? $var2 = $var3 = $var : false;

这个特定测试实例的更好的选择:

$error = (isset($var)) ? !(bool)($var2 = $var3 = $var) : true;

这会将$error 设置为true,如果$var 未设置,则设置为false,如果$var 已设置,因此您可以使用if($error) 块跟进此操作。

但是,三元可能不是解决这个问题的最佳方法...

对于更复杂的实例,您需要使用闭包,或者更糟糕的是,使用预先声明的函数:

$output = (isset($var)) ? setVars($var) : false;

function setVars($var) {
    $var2 = $var3 = $var;
}

此时,您最好使用ifswitch 语句。

【讨论】:

    【解决方案3】:

    据我所知,这是不可能的,也不应该是不可能的。 (?:) 不是,也不应该被视为if,因为它的工作方式不同,而且不是为它设计的。

    三元运算符的存在是作为根据条件返回值的一种方式,而不是作为“快速” if。

    如果你使用它而不需要返回值,那么你可能是用错了。

    在这种特定情况下,您应该使用 if-else 语句。它还有助于使您的代码更具可读性。

    【讨论】:

    • 我明白你的意思,只是有点沮丧,它必须是“那么”简单。但我想简单和复杂之间的界限必须在某个地方画出来……
    • 问题是已经为 if-else 的特定情况创建了三元组:if(condition){value=X;}else{value=Y}。您可以尝试将其用于其他用途,但请记住,它基本上会重现此行为,因此仅限于相同类型的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多