0

我很好奇 PHP 如何使用嵌套处理条件语句/操作顺序。如果我使用以下if条件:

if(x == (1 || 2))
{
    // do something
}

我希望它的行为与

if(x == 1 || x == 2)
{
    // do something
}

...但事实并非如此。我的第一个示例似乎是一个很方便的速记,但它并没有达到我的预期。任何人都可以阐明这个问题吗?PHP 究竟对我的第一个语句做了什么?

4

8 回答 8

2

你的速记在逻辑上是无效的。几乎在每种情况下,您都必须为要测试的所有可能性写出完整的逻辑案例。

我说“几乎”是因为在 PHP 中你可以做一些荒谬的事情,比如:

if( in_array($x, array(1,2)) ) {
  // code!
}
于 2013-02-21T17:30:02.367 回答
2

所以对于这段代码:

if ($x == ( 1 || 2)) 
{
    // do something
}

在 PHP 中,任何非零数都被认为是真的。免责声明:这一事实在其他语言中不一定是正确的。所以在 PHP 中,0 是唯一被认为是错误的数字。所以你问是否$x == true在上面的代码中。

因此,只要$x是 0 以外的任何数字,则内部的语句if将解析为true. 但是,当$x = 0then 就等于说false == truewhich 当然会解析为false.

这篇文章可能会有所帮助:PHP:布尔值

于 2013-02-21T17:43:52.907 回答
1
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()); 
于 2013-02-21T17:19:49.803 回答
1

请参阅此处了解运算符的优先级 http://php.net/manual/en/language.operators.precedence.php

于 2013-02-21T17:19:53.777 回答
1

它的行为与数学相同(想想 BEDMAS),首先执行括号。所以你的例子表现为:

if (x == ( 1 || 2)) {
  //code
}

并且因为 1 和 2 都是非零值(因此都是真的),你得到:

if (x == true) {
  //code
}

不幸的是,要得到你想要的,你需要:

if (x == 1 || x == 2) {
  //code
}
于 2013-02-21T17:19:56.307 回答
0

首先,如果评估结果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 第二种方法是要走的路

于 2013-02-21T17:20:06.260 回答
0

这有什么意义?您要求计算机执行以下逻辑表达式:

if x == (1 || 2)与 x ==相同(1 || 2的结果)

所以你的表达式是x == true since 1 || 2将返回 true

计算机做你告诉他们做的任何事情

于 2013-02-21T17:20:32.860 回答
0
if(x == (1 || 2))
{
    // do something
}

OR并且AND操作返回TRUE或者FALSE 您声明说 - 如果 x 等于(真) -1 or 2永远是真的 - 这只是没有意义......

于 2013-02-21T17:21:24.037 回答