如何使交换机尊重数据类型(如果/ else,有更好的解决方法吗?)
switch ($value) { case '0' : echo 'zero'; break; case '' : echo 'empty'; break; case null : echo 'null'; break; case false : echo 'false'; break; default : echo 'default'; break; }
切换
答案 0 :(得分:29)
switch (true) {
case $value === '0' :
echo 'zero';
break;
case $value === '' :
echo 'empty';
break;
case $value === null :
echo 'null';
break;
case $value === false :
echo 'false';
break;
default :
echo 'default';
break;
}
我认为,它比if-elseif
链更具可读性,如下所示:
if ($value === '0') {
echo 'zero';
} else if ($value === '') {
echo 'empty';
} else if ($value === null) {
echo 'null';
} else if ($value === false) {
echo 'false';
} else {
echo 'default';
}
答案 1 :(得分:5)
我相信你可以尝试if-then以便于使用'==='代替:
<?php
$value = 0;
if ($value==="") {
echo "blank (string)";
}
else
if ($value==="0") {
echo "zero (string)";
}
else
if ($value===false) {
echo "false (boolean)";
}
else
if ($value===null) {
echo "null (object)";
}
else
if ($value===0) {
echo "zero (number)";
}
else {
echo "other";
}
?>
答案 2 :(得分:2)
在php.net手册中,它是
注意:请注意,开关/案例有loose comparision。
"loose comparison" means that switch won't check the type.
switch will only compare values:
<?php
if('a string' == 0) echo 'a string is 0' . PHP_EOL;
if('a string' === 0) echo 'but you will never see this' . PHP_EOL;
switch(0){
case 'a string': echo 'a string' . PHP_EOL;
case 'another string': echo 'another string' . PHP_EOL;
}
if('a string' == true) echo 'a string is TRUE' . PHP_EOL;
if('a string' === true) echo 'but you will never see this' . PHP_EOL;
switch(true){
case 'a string': echo 'a string' . PHP_EOL;
case 'another string': echo 'another string' . PHP_EOL;
}
?>
will output:
a string is 0
a string
another string
a string is TRUE
a string
another string
答案 3 :(得分:1)
请记住,您要求PHP juggle types。
如果您看到PHP type comparison table,您会看到null
,''
和null == ''
非常等效,即{{1}}。
答案 4 :(得分:0)
另一种选择,取决于您想要查看的内容:
switch($foo ?: strtoupper(gettype($foo))){
case 'bar':
case 'bork':
echo $foo;
break;
case 'NULL': // $foo === null
echo 'null';
break;
case 'INTEGER': // $foo === 0
echo 'zero';
break;
case 'ARRAY': // $foo === array()
echo 'array';
break;
case 'STRING': // $foo === ''
echo 'empty';
break;
case 'BOOLEAN': // $foo === false
echo 'false';
break;
default:
echo $foo;
break;
}
根据您的数据,您可以添加下划线以增加清晰度,例如'_NULL',但它不是那么干净的IMO。
个人而言,我同意接受快速空检查的答案:case $foo === null: