我很好奇 PHP 如何使用嵌套处理条件语句/操作顺序。如果我使用以下if
条件:
if(x == (1 || 2))
{
// do something
}
我希望它的行为与
if(x == 1 || x == 2)
{
// do something
}
...但事实并非如此。我的第一个示例似乎是一个很方便的速记,但它并没有达到我的预期。任何人都可以阐明这个问题吗?PHP 究竟对我的第一个语句做了什么?
我很好奇 PHP 如何使用嵌套处理条件语句/操作顺序。如果我使用以下if
条件:
if(x == (1 || 2))
{
// do something
}
我希望它的行为与
if(x == 1 || x == 2)
{
// do something
}
...但事实并非如此。我的第一个示例似乎是一个很方便的速记,但它并没有达到我的预期。任何人都可以阐明这个问题吗?PHP 究竟对我的第一个语句做了什么?
你的速记在逻辑上是无效的。几乎在每种情况下,您都必须为要测试的所有可能性写出完整的逻辑案例。
我说“几乎”是因为在 PHP 中你可以做一些荒谬的事情,比如:
if( in_array($x, array(1,2)) ) {
// code!
}
所以对于这段代码:
if ($x == ( 1 || 2))
{
// do something
}
在 PHP 中,任何非零数都被认为是真的。免责声明:这一事实在其他语言中不一定是正确的。所以在 PHP 中,0 是唯一被认为是错误的数字。所以你问是否$x == true
在上面的代码中。
因此,只要$x
是 0 以外的任何数字,则内部的语句if
将解析为true
. 但是,当$x = 0
then 就等于说false == true
which 当然会解析为false
.
这篇文章可能会有所帮助:PHP:布尔值
x == (1 || 2)
evaluates like this:
(1 (if its false) then testing for 2, if not, the expression returns true)
now it will become:
if(x==true)?
另一个来自(PHP.NET)的例子:
// foo() 永远不会被调用,因为这些操作符是短路的
$b = (true || foo());
请参阅此处了解运算符的优先级 http://php.net/manual/en/language.operators.precedence.php
它的行为与数学相同(想想 BEDMAS),首先执行括号。所以你的例子表现为:
if (x == ( 1 || 2)) {
//code
}
并且因为 1 和 2 都是非零值(因此都是真的),你得到:
if (x == true) {
//code
}
不幸的是,要得到你想要的,你需要:
if (x == 1 || x == 2) {
//code
}
首先,如果评估结果1||2
并检查它是否等于 x
在第二个它喜欢this or this or this
但是首先你可以看到var_dump(1 || 2)
每次都返回 true 所以
$x = 3;
var_dump($x == 1 || 2);
if($x == 1 || 2){
echo 'inside if';
}
也是如此inside if
,因此即使 $x 为 3也会打印
所以 imo 第二种方法是要走的路
这有什么意义?您要求计算机执行以下逻辑表达式:
if x == (1 || 2)与 x ==相同(1 || 2的结果)
所以你的表达式是x == true since 1 || 2将返回 true
计算机做你告诉他们做的任何事情
if(x == (1 || 2))
{
// do something
}
OR
并且AND
操作返回TRUE
或者FALSE
您声明说 - 如果 x 等于(真) -1 or 2
永远是真的 - 这只是没有意义......