谁能给我解释下面的代码?
$var OR $var = $something;
Run Code Online (Sandbox Code Playgroud)
谷歌搜索了很多,但找不到任何相关的东西.
为什么OR在左侧而不是右侧的javascript语法?它们是相同的,还是有区别的?
tldr; 这基本上只是一个初始化步骤,并确保变量$var保存一些非假的值.用英语说出以下内容:
评估存储的值
$var.如果它是真的,那就很棒.否则,设置$var等于$something.
这个怎么运作
这利用了OR的短路特性,如手册中所述:
// 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());
Run Code Online (Sandbox Code Playgroud)
虽然我发现这在JavaScript中很常见,但我很少在PHP中看到这种类型的代码.我相信这与以下事实有关:在JavaScript中,您可以调用函数而无需传递任何命名参数:
function testFn(param1, param2) {
param1 = param1 || 'default value';
param2 = param2 || 'default param2 value';
}
testFn();
testFn(12);
testFn(12, 13);
Run Code Online (Sandbox Code Playgroud)
所有这三个函数调用都是合法的.第一个将参数设置为其'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);
Run Code Online (Sandbox Code Playgroud)
通过函数签名设置默认参数对我来说似乎更容易理解.
啰嗦的具体例子
请考虑以下声明:
if(false && functionThatReturnsTrue()) {}
Run Code Online (Sandbox Code Playgroud)
显然,这总体上不可能是真实的,但重要的一点是functionThatReturnsTrue永远不会被召唤.现在,我可以提出完整的条件,以制定一个全新的,完全合法的声明:
false && functionThatReturnsTrue();
Run Code Online (Sandbox Code Playgroud)
仍然functionThatReturnsTrue没有被召唤.但是,如果我将其更改&&为a ||,它将:
function functionThatReturnsTrue() {
echo "I'm true!";
}
false || functionThatReturnsTrue();
Run Code Online (Sandbox Code Playgroud)
以上,请注意functionThatReturnsTrue甚至不返回任何东西!将评估上面的整个表达式(它将评估整体false),但不会存储在任何地方.另请注意,该功能将被调用并将"I'm true!"显示在屏幕上.
现在让我们functionThatReturnsTrue用变量赋值替换:
false || $var = 12;
Run Code Online (Sandbox Code Playgroud)
这里将有三个将被评估的表达式:( false没有副作用),$var = 12(设置$var等于12)和整体表达式false || 12(因为为变量赋值的结果是赋值的值,这就是为什么你也可以做的事情return $var = 12;).执行该行代码后,$var将等于12.
现在让我们先false用你的代替$var:
$var || $var = 12;
Run Code Online (Sandbox Code Playgroud)
如果$var恰好是东西比其他null,false0,或''(任何可估算false),则表达式$var = 12 将不会被执行,并且$var将它收到这条线跑相同的值.然而,如果它是假的,那么它将不再等于它,它现在将等于12.
让我们再迈出一步,让它变得有点复杂:
$whatAmI = ($var || $var = 12);
Run Code Online (Sandbox Code Playgroud)
在这里,我采用了前面的表达式,将其包装在括号中,我实际上将结果保存在一个名为变量的变量中,$whatAmI而不是将其放入位桶中. $whatAmI将是一个boolean值(因为它持有||操作的结果)并且可能有两个副作用正在执行此行:
$var 可能已更新为值12$whatAmI 现在将保持一个布尔值 true