我有一个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, 等......成功之后。但这涉及更多的代码,我宁愿 找出为什么这种方式不起作用。
答案 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))) {