Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你知道一个很好的PHP黑客做内联条件赋值吗?_Php_Javascript_Operators - Fatal编程技术网

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

你知道一个很好的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) 当然,

我非常喜欢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)
当然,我们可以使用以下方式进行内联分配:

但这使得代码模棱两可,这不是那么容易阅读


所以我的问题来了:

你知道一个很好的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
,这个问题(以及公认的答案)应该小心使用。@Ninsuo
0
'
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");