你好,我有以下代码,令我困惑。这是怎么回事?
<?php
$concept = '0';
switch ($concept) {
case ($concept > '0'):
$score = 'Y';
break;
}
?>
答案 0 :(得分:3)
你的开关是$ concept;你的情况是($ concept&gt;'0'),其评估为FALSE,所以你有效地说case FALSE:
;将FALSE与开关条件($ concept)进行比较,即'0';松散的类型给出'0'与FALSE的比较,其评估为TRUE;因此,情况得到满足。
我不知道你真正理解switch语句实际上是做什么的;但它不仅仅是if语句的替代
答案 1 :(得分:3)
来自switch
文档:
注意: 请注意,开关/外壳没有松动比较。
Check the falsy-ness for '0'
,这很可怕,我知道。您的案例评估为false
,正如您在链接的tbl中看到的那样('0' == false) === true
。
我将您的switch
声明更改为:
switch(true)
{
case ($concept >'0'):
echo 'Impossible';
break;
}
此外,正如文档所说:switch
是一个循环式结构,执行松散比较。您无法自己选择比较运算符。如果你想针对一系列案例检查$concept
的值,你必须写:
switch($concept)
{
case '0': echo 'a zero string'; break;
case '1': echo 'a 1 concept'; break;
}
答案 2 :(得分:3)
就像这样。
<?php
$concept = '0'; // 1. This is a string
switch ($concept) { // 3. boolean FALSE is compared to $concept,
// which forces $concept to be cast to boolean,
// thus the comparison is FALSE == FALSE which equals TRUE
case ($concept > '0'): // 2. ($concept > '0') evaluates to boolean FALSE
$score = 'Y';
break;
}
请注意我在评论中添加的数字,以显示评估事物的顺序。 (非常简单)。
你可以做些什么来避免类型问题是这样的:
<?php
$concept = '0';
switch (TRUE) {
case ($concept > '0'):
$score = 'Y';
break;
}
这样做是将所有案例条件与TRUE进行比较,并且更像您期望的那样工作。请注意,switch的这种用法有点不同寻常,但可以避免PHP中的某些类型转换问题。
答案 3 :(得分:2)
它将$ concept与$ concept&gt;的结果进行比较'0'
$concept = '0' // '0' == false
$concept > '0' // '0'>'0' == false
你的statemant等于:
switch (false){
case (false):
$score = 'Y';
break;
}
答案 4 :(得分:1)
您的情况是匹配的,因为false==false
这是如何发生的首先采用您的切换条件$concept
,初始值为字符串“0”。
然后让你的case语句$concept > 0
这个表达式求值为false
并在switch块执行之前进行求值,因为switch语句将块值与调用值匹配。
然后在进行匹配时,$concept
value =“0”正在转换为布尔值false
。
所以false==false