有人能给我解释下面的代码吗?
$var OR $var = $something;
搜索了很多内容,但无法找到相关内容。
为什么右侧是OR而不是右侧的javascript语法?它们是相同的,还是有区别的?
答案 0 :(得分:7)
tldr; 这基本上只是一个初始化步骤,并确保变量$var
保存一些非虚假的值。用英语说出以下内容:
评估
$var
中存储的值。如果它是真的,那就很棒。否则,请将$var
设置为$something
。
工作原理
这利用了OR的短路特性,如manual中所述:
// foo() will never get called as those operators are short-circuit
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
虽然我发现这在JavaScript中很常见,但我很少在PHP中看到这种类型的代码。我相信这与以下事实有关:在JavaScript中,您可以调用函数而无需传递任何命名参数:
function testFn(param1, param2) {
param1 = param1 || 'default value';
param2 = param2 || 'default param2 value';
}
testFn();
testFn(12);
testFn(12, 13);
所有这三个函数调用都是合法的。第一个将参数设置为'default ...'
值。第二个参数将第一个参数设置为12
,第二个参数设置为'default param2 value'
,第三个参数将第一个参数设置为12,第二个参数设置为13。
在PHP中你也可以,但是你必须为函数签名中的变量提供默认值,否则它将导致PHP Warning: Missing argument 1 for ...
:
function testFn($param1 = 'default1', $param2 = 'default2') { }
testFn();
testFn(12);
testFn(12, 13);
通过函数的签名设置默认参数对我来说似乎更容易理解。
啰嗦的具体例子
考虑这个陈述:
if(false && functionThatReturnsTrue()) {}
显然,总的来说这不可能是真的,但重要的是,functionThatReturnsTrue
永远不会被调用。现在,我可以提出完整的条件,以制定一个全新的,完全合法的声明:
false && functionThatReturnsTrue();
仍然,functionThatReturnsTrue
没有被调用。但是,如果我将&&
更改为||
,则会:
function functionThatReturnsTrue() {
echo "I'm true!";
}
false || functionThatReturnsTrue();
上面,请注意functionThatReturnsTrue
甚至没有返回任何内容! 上面的整个表达式将被评估(它将整体评估为false
),但将不会存储在任何地方。另请注意,函数将被调用,"I'm true!"
将显示在屏幕上。
现在让我们用变量赋值替换functionThatReturnsTrue
:
false || $var = 12;
在这里,将会评估三个表达式:false
(没有副作用),$var = 12
(将$var
设置为等于12),以及整体表达式false || 12
(因为为变量赋值的结果是赋值的值,这就是为什么你也可以做return $var = 12;
之类的事情。执行该行代码后,$var
将等于12。
现在让我们用您的false
替换$var
:
$var || $var = 12;
如果$var
恰好是null
,false
,0或''
(anything that can evaluate to false
)以外的任何内容,那么表达式{{1} } 将不会执行,$var = 12
将具有与此行运行之前相同的值。然而,如果它是假的,那么它将不再等于它,它现在将等于12。
让我们再迈出一步,让它变得更复杂一点:
$var
在这里,我使用了前面的表达式,将其包装在括号中,我实际上将结果保存在名为$whatAmI = ($var || $var = 12);
的变量中,而不是将其放入位桶中。 $whatAmI
将是$whatAmI
值(因为它持有boolean
操作的结果)并且可能会对此行执行两个副作用:
||
可能已更新为值12 $var
现在将保留一个布尔值$whatAmI