此代码有效:
$foo = getFoo();
if (!$foo) $foo = getBar();
if (!$foo) $foo = getJiggy();
if (!$foo) $foo = getWithIt();
我以为我在某处用逻辑运算符看到了它的简化:
$foo = (getFoo() || getBar() || getJiggy() || ...);
我认为第一个真实的陈述会被传递,但是,它只是将$ foo设置为布尔true
而不是getFoo()
,getBar()
等的返回值。 / p>
是否有像我想的那样的简化?
答案 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());