奇怪的IF声明行为

时间:2009-10-25 17:43:41

标签: php

我有一个IF语句,它包含两个独立的函数调用 将值传递给两个变量。显然,如果这两个值都不是'FALSE' 然后执行代码块:

<?php
   class MyValidater {
      static function validateString($string) {
         if (preg_match("/[A-Za-z]+/", $string)) {
            return $string;
         } else {
            return false;
         }
      }
   }

   $firstName = "Daniel";
   $surname = "Simmons";

   // Dodgy IF statement
   if ($first = MyValidater::validateString($firstName) && $second = MyValidater::validateString($surname)) {
      print("Success: $first $second");
   } else {
      print("Fail: $first $second");
   }
?>

正如您所看到的,$ first和$ second变量都应该包含 成功后,$ firstName和$ surname中保存的值 由Static方法validateString验证。

然而,两个变量的值最终结果为:$ first ='1'和 $ second =“西蒙斯”。

'1'应该是“Daniel”,但由于某种原因,$ first正在通过 值'1'或TRUE。如果你交换两个赋值语句 所以首先评估$ second,你最后得到相反的结果 结果和以前一样。 $ second ='1'和$ first =“Daniel”

任何人都可以解释为什么返回String值“Daniel” 类方法被改为第一部分的int'1' 只有条件陈述?我快速浏览了一下 PHP文档但无法找到解释。

目前,解决方法是更改​​返回值 静态方法为true / false然后make $ first = $ firstName, 等......成功之后。但这涉及更多的代码,我宁愿 找出为什么这种方式不起作用。

5 个答案:

答案 0 :(得分:7)

您需要括起表达式:

if (($first = MyValidater::validateString($firstName)) && ($second = MyValidater::validateString($surname)))

实际发生的是:

if ($first = (MyValidater::validateString($firstName) && $second = MyValidater::validateString($surname)))

这样做会更清楚(注意这段代码与你的代码不同):

$first = MyValidater::validateString($firstName);
$second = MyValidater::validateString($surname);

if ($first && $second)

答案 1 :(得分:5)

&&高于运算符优先级=。添加括号,它将起作用。

http://www.php.net/manual/en/language.operators.precedence.php

您可以在此处阅读有关运算符优先级的信息。

此外,在if条件中设置值通常是不好的做法。如果你添加括号,你很可能会看到原因(让$ first设置为false,$ second设置为字符串)=&gt;第一个将被评估,但由于它是假的,它将不会进一步处理,因为它将转到else。 =&GT;如果first = false,则第二个将不会设置正确。

答案 2 :(得分:0)

尝试使用括号

($first = MyValidater::validateString($firstName)) && ($second = MyValidater::validateString($surname)))

首先得到第一个函数调用的结果,第二个函数得到一个值。

答案 3 :(得分:0)

=是属性的 ==用于比较,数据类型无关紧要 ===用于比较,数据类型很重要

答案 4 :(得分:0)

正在发生的事情是,PHP首先使用“MyValidater :: validateString($ firstName))&amp;&amp; $ second = MyValidater :: validateString($ surname)“

第一次比较需要括号,第二次需要括号。

   if ( ($first = MyValidater::validateString($firstName)) && ($second = MyValidater::validateString($surname))) {