如果条件为真,则在条件语句中赋值给变量

8

我知道你可以在条件语句中这样赋值:

if ($var = $foo)

然而,我不需要在条件语句中做任何事情,所以经常会留下空括号。如果$footrue,我能否以其他方式简单地赋值$var而无需稍后进行其他操作?

另外,如果$footrue,我能否将$var赋值给$foo,但如果$foofalse则执行其他操作?例如:

if ($var = !$foo) {
    if ($var = !$bar) {
        //Etc...
    }
}

基本上,我想要更多的后备方案和默认值。

请再说一遍……? - Hanky Panky
1
你可以使用 if ($foo),当 foo 为真时它会起作用。 - Ahmed Z.
你没有在条件语句中进行赋值。你无论如何都会进行赋值,而不管 $foo 的值是什么。所以如果你只想在 $foo 为真时才用 $foo 覆盖 $var,你需要移动赋值语句。或者像这样做:if ($foo && $var = $foo) {},但我认为后者真的很糟糕。 - Yoshi
@Yoshi 我的问题更多是关于在 $var 的值被赋值之后发生了什么。所以如果赋值失败,需要有一个备选方案。答案展示了我想要做的事情。感谢您的评论。 - Jared
4个回答

11

@chandresh_cool的建议是正确的,但为了允许多种可能性/回退,您需要嵌套三元表达式:

$var = ($foo == true) ? $foo: 
       ($bar == true) ? $bar: 
       ($fuzz == true) ? $fuzz:
       $default;
注意:前三行以冒号而非分号结尾。
不过,一个更简单的解决方案是执行以下操作:
$var = ($foo||$bar||$fuzz...);

你提供的简单解决方案正是我所需要的。它简洁明了,而且能够实现我的需求:将$var设置为它能找到的第一个正值。 - Jared
1
如果您选择第一种选项,请不要使用“== true”,而是使用“$var = ($foo) ? $.....”。 - Veda

5
尽管这是一个非常旧的帖子,但可以像这样编写关于“虚假值”的后备逻辑。
$var = $foo ?: $bar ?: "default";

在这种情况下,当$foo是一个虚假的值(比如 false、空字符串等)时,它将会回退到$bar,否则它将使用$foo。 如果$bar是一个虚假的值,它将会回退到字符串default
请注意,这适用于虚假值,而不仅仅是true
示例:
$foo = "";
$bar = null;
$var = $foo ?: $bar ?: "default";  

$var将包含文本default,因为空字符串和null被视为“false”值。

[更新]

在php 7中,您可以使用新的null合并运算符:??,它还使用isset()检查变量是否存在。当您在数组中使用键时,这非常有用。

例:

$array = [];
$bar = null;
$var = $array['foo'] ?? $bar ?? "default";

在PHP 7之前,这将会出现一个Undefined index: foo的提示。但是有了null合并运算符,该提示就不会再出现。


@jconder - 我正在撤销您对此答案的编辑。Leroy说“否则它将使用$foo”,但您所做的编辑完全使其无效。Leroy在这里有意使用两个三元运算符(每个第一个表达式为空),允许3种可能的结果:$foo$bar“default”,而不是使用单个三元运算符,它只能返回2种可能的结果:$bar“default” - HPierce
是的,你说得对,我的错,我错过了帖子的全部要点。 - jconder
这样做会让 if 表达式更加简洁。我正在使用它来检查 WordPress 中的自定义文章类型 $is_entry = is_singular( 'myentry' ) ?: is_post_type_archive( 'myentry' ) ?: false;。现在我可以使用 if ( $is_entry && $other_condition ) 来判断当前页面是否属于我的文章类型,而不必让 if 表达式变得太丑陋。 - iyrin
在php7中,有一个新的空合并运算符:??,它还像isset()一样检查变量是否存在。当您在数组中使用键时,这非常有用。例如:$var = $array['key'] ?? $bar ?: "default"。现在,当$array中的key不存在时,它不会抛出任何错误。因为它也会查看key是否存在。 - Leroy

4

你可以使用三元运算符来替代

$var = ($foo == true)?$foo:"put here what you want";

虽然还有点冗长,但它能够工作,所以我会给你的回答 +1。 - Jared

3
您可以像这样分配值:
$var = $foo;

在if语句中设置它们也是可能的,PHP将评估您刚刚分配的$var。

我不太明白你的问题,但你可以这样做:

if(!($var = $foo)){
   //something else.
}

你的if语句代码看起来像我想要做的,但RobJ的答案更好。尽管如此,我还是会给你一个+1。 - Jared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接