我可以使用逻辑OR ||在PHP变量声明?

时间:2012-10-09 15:28:26

标签: php logical-operators

此代码有效:

$foo = getFoo();
if (!$foo) $foo = getBar();
if (!$foo) $foo = getJiggy();
if (!$foo) $foo = getWithIt();

我以为我在某处用逻辑运算符看到了它的简化:

$foo = (getFoo() || getBar() || getJiggy() || ...);

我认为第一个真实的陈述会被传递,但是,它只是将$ foo设置为布尔true而不是getFoo()getBar()等的返回值。 / p>

是否有像我想的那样的简化?

6 个答案:

答案 0 :(得分:5)

对于JavaScript,foo = bar || baz;是一种常用的表达式,因为||运算符具有合并行为。

PHP对||运算符没有这种行为,它返回一个布尔值。因此,您最初发布的代码更详细:

$foo = getFoo();
if (!$foo) $foo = getBar();
if (!$foo) $foo = getJiggy();
if (!$foo) $foo = getWithIt();

是您最具可读性和最佳选择。

PHP 5.3 has a shorthand version of the ternary operator, which acts as a coalescing operator:

  

从PHP 5.3开始,可以省略三元运算符的中间部分。表达式expr1?:expr3如果expr1的计算结果为TRUE则返回expr1,否则返回expr3。

这将允许您使用:

$foo = getFoo() ?: getBar() ?: getJiggy() ?: getWithIt();

但是,假设您不必担心兼容性。

答案 1 :(得分:1)

你可以尝试

$foo = getFoo() or $foo = getBar() or $foo = getJiggy() or $foo = getWithIt();
var_dump($foo);

输出

string 'Stop Here' (length=9)

使用的功能

function getFoo() {
    return false;
}

function getBar() {
    return false;
}

function getJiggy() {
    return "Stop Here";
}

function getWithIt() {
    return "Hello World";
}

答案 2 :(得分:0)

您可以使用嵌套的三元运算符。类似的东西:

$foo = (!$foo)? getFoo() : ((!$foo)? getBar() : getJiggy()) ;

答案 3 :(得分:0)

您可以使用较弱优先级or并构建条件+赋值链,如下所示:

    $foo = getFoo()
OR  $foo = getBar()
OR  $foo = getJiggy()
OR  $foo = getWithIt();

为了便于阅读并让其他人理解这种操作员滥用,间距是必不可少的。

答案 4 :(得分:0)

如果确实想要重写代码,可以使用call_user_func,但这不是一个非常优雅的解决方案:

$foo = false;//best declare vars before using them, to avoid warnings in strict mode
$functions = array('getFoo', 'getBar','getJiggy','getWithIt');
while(!$foo && $func = array_shift($functions))
{
    $foo = call_user_func($func,null);//replace null with optional parameters
}

但正如你所看到的,这将更难以维持......

答案 5 :(得分:-1)

尝试

($foo = getFoo()) || ($foo = getBar()) || ($foo = getJiggy());