var或var在php中意味着什么?

时间:2015-03-25 15:25:04

标签: php

有人能给我解释下面的代码吗?

$var OR $var = $something;

搜索了很多内容,但无法找到相关内容。

为什么右侧是OR而不是右侧的javascript语法?它们是相同的,还是有区别的?

1 个答案:

答案 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恰好是nullfalse,0或''anything that can evaluate to false)以外的任何内容,那么表达式{{1} } 将不会执行$var = 12将具有与此行运行之前相同的值。然而,如果它是假的,那么它将不再等于它,它现在将等于12。

让我们再迈出一步,让它变得更复杂一点:

$var

在这里,我使用了前面的表达式,将其包装在括号中,我实际上将结果保存在名为$whatAmI = ($var || $var = 12); 的变量中,而不是将其放入位桶中。 $whatAmI将是$whatAmI值(因为它持有boolean操作的结果)并且可能会对此行执行两个副作用:

  1. || 可能已更新为值12
  2. $var现在将保留一个布尔值$whatAmI