PHP IF 和 Switch 语句中的奇怪情况
PHP strange situation in IF and Switch statment
我在 PHP 中使用 IF
和 Switch
语句时遇到了一个非常奇怪的情况。谁能解释为什么下面的 IF
条件成立而不执行 ELSE
块。 Switch
语句也是如此,它没有执行 default
块。
感谢您的宝贵时间:)
$error = TRUE;
if ($error == FALSE OR $error == 'stringValue') {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
switch($error){
case FALSE:
case 'stringValue':
echo 'Inside First';
break;
default:
echo 'Inside Default';
break;
}
它发生只是因为这一行:
if ($error == FALSE OR $error == 'stringValue') {
// your stuff
}
此处您将 $error 定义为 true 并使用 OR 运算符。
$error == 'stringValue'
也有成真的意思。
一个基本的例子:
$error = true;
if ($error == "somthing") {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
它总是打印 "Inside IF" 但是为什么呢?看看这个例子:
if (true == "somthing") {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
两者将被视为相同。试试吧。
试试这个
<?php
$error = TRUE;
if($error === FALSE || $error === 'stringValue') {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
switch($error){
case FALSE:
//case 'stringValue':
echo 'Inside First';
break;
default:
echo 'Inside Default';
break;
}
?>
你也可以在你的代码中做这件事 -
只需将$error ='TRUE';设为字符串,因为此时它是布尔值。
是针对类型的。 == 在类型转换后检查是否相等。但是如果你想检查相同的类型,你应该使用 === 。如果两个运算符的类型相同,则 return 为真。所以你可以使用 === 而不是 ==。
像这样-
$error = TRUE;
if ($error === FALSE OR $error === 'stringValue') {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
它显示在 ELSE 内部。
有关更多信息,请检查它-
http://php.net/manual/en/language.operators.comparison.php
如前一个答案所述,== 运算符不匹配类型,而只匹配值,因此如果比较 2 个不同类型的值 PHP 试图将其中一个变量转换为另一个的类型。
同样的事情也适用于使用开关。我测试此选项以将 $error 转换为字符串类型。
$error = TRUE;
if ($error == FALSE OR strval($error) == 'stringValue') {
echo 'Inside IF;
} else {
echo 'Inside ELSE';
}
switch(strval($error)){
case FALSE:
case 'stringValue':
echo 'Inside First';
break;
case TRUE:
echo 'Inside true'; break;
default:
echo 'Inside Default';
break;
}
输出
在 ELSE 里面 在 true
里面
我在 PHP 中使用 IF
和 Switch
语句时遇到了一个非常奇怪的情况。谁能解释为什么下面的 IF
条件成立而不执行 ELSE
块。 Switch
语句也是如此,它没有执行 default
块。
感谢您的宝贵时间:)
$error = TRUE;
if ($error == FALSE OR $error == 'stringValue') {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
switch($error){
case FALSE:
case 'stringValue':
echo 'Inside First';
break;
default:
echo 'Inside Default';
break;
}
它发生只是因为这一行:
if ($error == FALSE OR $error == 'stringValue') {
// your stuff
}
此处您将 $error 定义为 true 并使用 OR 运算符。
$error == 'stringValue'
也有成真的意思。
一个基本的例子:
$error = true;
if ($error == "somthing") {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
它总是打印 "Inside IF" 但是为什么呢?看看这个例子:
if (true == "somthing") {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
两者将被视为相同。试试吧。
试试这个
<?php
$error = TRUE;
if($error === FALSE || $error === 'stringValue') {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
switch($error){
case FALSE:
//case 'stringValue':
echo 'Inside First';
break;
default:
echo 'Inside Default';
break;
}
?>
你也可以在你的代码中做这件事 -
只需将$error ='TRUE';设为字符串,因为此时它是布尔值。
是针对类型的。 == 在类型转换后检查是否相等。但是如果你想检查相同的类型,你应该使用 === 。如果两个运算符的类型相同,则 return 为真。所以你可以使用 === 而不是 ==。
像这样-
$error = TRUE;
if ($error === FALSE OR $error === 'stringValue') {
echo 'Inside IF';
} else {
echo 'Inside ELSE';
}
它显示在 ELSE 内部。
有关更多信息,请检查它-
http://php.net/manual/en/language.operators.comparison.php
如前一个答案所述,== 运算符不匹配类型,而只匹配值,因此如果比较 2 个不同类型的值 PHP 试图将其中一个变量转换为另一个的类型。
同样的事情也适用于使用开关。我测试此选项以将 $error 转换为字符串类型。
$error = TRUE;
if ($error == FALSE OR strval($error) == 'stringValue') {
echo 'Inside IF;
} else {
echo 'Inside ELSE';
}
switch(strval($error)){
case FALSE:
case 'stringValue':
echo 'Inside First';
break;
case TRUE:
echo 'Inside true'; break;
default:
echo 'Inside Default';
break;
}
输出 在 ELSE 里面 在 true
里面