0

此代码有效:

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

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

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

我认为第一个 true 语句会通过,但它只是将 $foo 设置为布尔值,而不是,等true的返回值。getFoo()getBar()

有没有像我想的那样简化?

4

6 回答 6

5

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

||PHP 对于返回布尔值的运算符没有这种行为。因此,您最初发布的代码越冗长:

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

是您最易读且更可取的选择。

PHP 5.3 有一个三元运算符的简写版本,它充当合并运算符:

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

这将允许您使用:

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

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

于 2012-10-09T15:38:49.557 回答
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";
}
于 2012-10-09T15:38:23.130 回答
0

You can use nested ternary operator. Something like:

$foo = (!$foo)? getFoo() : ((!$foo)? getBar() : getJiggy()) ;
于 2012-10-09T15:32:03.840 回答
0

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

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

为了可读性和便于其他人理解这种操作符的误用,间距是必不可少的。

于 2012-10-09T15:39:04.947 回答
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
}

但正如您所看到的,这将更难以维护......

于 2012-10-09T15:44:45.407 回答
-1

尝试

($foo = getFoo()) || ($foo = getBar()) || ($foo = getJiggy());
于 2012-10-09T15:32:39.723 回答