你知道一个很好的PHP黑客做内联条件赋值吗?
我非常喜欢JavaScript中的你知道一个很好的PHP黑客做内联条件赋值吗?,php,javascript,operators,Php,Javascript,Operators,我非常喜欢JavaScript中的|操作符,在这里我们可以进行内联条件赋值 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) 当然,
|
操作符,在这里我们可以进行内联条件赋值
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)
当然,我们可以使用以下方式进行内联分配:
但这使得代码模棱两可,这不是那么容易阅读
所以我的问题来了: 你知道一个很好的PHP黑客做内联条件赋值吗 在PHP5.3+中:
只要您不需要短路副作用,这将起作用:
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");
函数_或(){
$nargs=func_num_args();
如果($nargs==0){
返回false;
}
$args=func_get_args();
对于($i=0;$i<$nargs-1;$i++){
如果($args[$i]){
返回$args[$i];
}
}
返回$args[$nargs-1];
}
$test=_或($a,$b,“默认值”);
如果你不关心副作用,你可以编写一个简单的函数来实现。使用开关或添加括号$test=($a?$a:($b?$b:'default'))
@BassJobsen,他不想使用三进制。@不要,因为你不重复操作数。它具有与<代码>相同的可读性,一个是{b} c/c>,只是添加了括号。你有一个点,但对我来说,这仍然是“难以阅读”:(难以阅读,因为你可以考虑困难的三元组)@欺骗,不需要括号。这个解决方案正是我所寻找的。@嗯,对于传统的三元运算符来说,paren肯定是必要的。它是否真的可以毫无疑问地工作?如果是这样,那太好了作为ternaries,这不是强制性的(但在ternaries中,没有括号,这只是头部杀手)。我同意0或“”不是false
,这个问题(以及公认的答案)应该小心使用。@Ninsuo0
和'
是false
。至少根据PHP。使用语言规定的内容,仅在必要时更改语言对“false
”的定义。:)您需要类似于Javascript表达式的内容,它将0
和'
视为false。我曾经有过一个版本的函数,它只是检查了false
或null
,但决定它不会等同于他正在替换的JS或三元。@deceze,是的,当然是,这就是Barmar指出的副作用。如果使用不当,三元捷径可能会导致意外(或至少不希望发生的)行为。deceze的评论与副作用无关。我的意思是你不能做或者(真的,$b/0)
,因为被零除法将发生在调用之前。但是true | |$b/0
由于短路而安全。
$test = $a ?: ($b ?: 'default value');
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");