微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

谁能给我解释下面的代码

$var OR $var = $something;

谷歌搜索了很多,但找不到任何相关的东西.

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

解决方法

tldr;这基本上只是一个初始化步骤,并确保变量$var保存一些非假的值.用英语说出以下内容

Evaluate the value stored in $var. If it is truthy,great stop right there. Otherwise,set $var equal to $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警告:缺少参数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),但不会存储在任何地方.另请注意,该函数将被调用并且“我是真的!”将显示在屏幕上.

现在让我们用一个变量赋值替换functionThatReturnsTrue:

false || $var = 12;

这里将有三个表达式将被评估:false(没有副作用),$var = 12(将$var设置为12),整个表达式为false || 12(因为为变量赋值的结果是赋值的值,这就是为什么你也可以执行返回$var = 12;)的原因.执行该行代码后,$var将等于12.

现在让我们用$var替换第一个false:

$var || $var = 12;

如果$var恰好是null,false,0或”(anything that can evaluate to false)以外的任何值,则表达式$var = 12将不会被执行,$var将具有与此行运行之前相同的值.然而,如果它是假的,那么它将不再等于它,它现在将等于12.

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

$whatAmI = ($var || $var = 12);

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

> $var可能已更新为值12> $whatAmI现在将保持布尔值true

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐