你知道一个很好的PHP hack来做内联条件赋值吗?

问题描述:

我真的喜欢JavaScript中的||运算符,我们可以在其中进行内联条件赋值。你知道一个很好的PHP hack来做内联条件赋值吗?

var a = 0; 
var b = 42; 
var test = a || b || 'default value'; 
console.log(test); // 42 

这是很清楚的阅读,并没有太多的线。


在PHP中,这个逻辑运算符返回布尔值:

$a = 0; 
$b = 42; 
$test = $a || $b || 'default value'; 
print_r($test); // bool(true) 

当然,我们可以使用ternaries做内联分配:

$test = $a ? $a : $b ? $b : 'default'; 
print_r($test); // int(42) 

但这个牌子代码暧昧,这不是容易阅读。


所以在这里,我的问题来了:

你知道一个很好的PHP黑客做内联有条件的分配?

+1

如果你不关心副作用,你可以写一个简单的函数来完成它。 – Barmar 2013-05-12 07:37:54

+0

http://php.net/manual/en/control-structures.switch.php使用开关或添加括号'$ test =($ a?$ a:($ b?$ b:'default'))' ; – 2013-05-12 07:51:47

+0

@BassJobsen,他不想使用三元组。 – 2013-05-12 07:54:13

在PHP 5.3+ you can do this

$test = $a ?: ($b ?: 'default value'); 
+1

以及它如何比三元数字更可读? – DonCallisto 2013-05-12 08:12:23

+0

@Don因为你不重复操作数。它具有与'a ||相同的可读性b || c',只是加了括号。 – deceze 2013-05-12 08:13:42

+0

你有一点,但对我来说,这仍然是“难以阅读”:)(难以阅读,因为你可以考虑困难的三元组) – DonCallisto 2013-05-12 08:14:40

这将工作,只要你不需要短路副作用:

function either_or() { 
    $nargs = func_num_args(); 
    if ($nargs == 0) { 
     return false; 
    } 
    $args = func_get_args(); 
    for ($i = 0; $i < $nargs-1; $i++) { 
     if ($args[$i]) { 
      return $args[$i]; 
     } 
    } 
    return $args[$nargs-1]; 
} 

$test = either_or($a, $b, "Default value"); 
+0

我同意0或''不是'false',应该小心使用这个问题(和接受的答案)。 – 2013-05-12 08:23:00

+0

@Ninsuo'0'和''''* * *为'false'。至少根据PHP。处理语言规定的内容,必要时只改变语言的“错误”定义。 :) – deceze 2013-05-12 08:33:23

+0

你想要类似于Javascript表达式的东西,它将'0'和''''视为false。我简要地介绍了一个只检查'false'或'null'的函数的版本,但认为它不等同于JS或他正在取代的三元组。 – Barmar 2013-05-12 08:36:34