make switch使用===比较不==比较在PHP中

Aar*_*ken 71 php type-conversion

反正是为了使下面的代码仍然使用开关b而不返回a?谢谢!

$var = 0;
switch($var) {
    case NULL : return 'a'; break;
    default : return 'b'; break;
}
Run Code Online (Sandbox Code Playgroud)

当然,使用if语句,你可以这样做:

$var = 0;
if($var === NULL) return 'a';
else return 'b';
Run Code Online (Sandbox Code Playgroud)

但是对于更复杂的例子,这变得冗长.

Pet*_*tai 51

抱歉,您不能===在switch语句中使用比较,因为根据switch()文档:

请注意,开关/外壳比较松散.

这意味着您必须提出一种解决方法.从松散的比较表中,您可以NULL == "0"通过类型转换来利用假的事实:

<?php
$var = 0;
switch((string)$var) 
{
    case "" : echo 'a'; break; // This tests for NULL or empty string   
    default : echo 'b'; break; // Everything else, including zero
}
// Output: 'b'
?>
Run Code Online (Sandbox Code Playgroud)

现场演示

  • 那么`switch`有什么意义呢?落空? (3认同)
  • 嗯,还有其他情况(不仅仅是 NULL)我希望它能够工作。 (2认同)

zvi*_*zvi 8

是的。在 PHP 8 上,您可以使用match语句来完成。

与 switch 不同的是,比较是身份检查 (===) 而不是弱相等检查 (==)。匹配表达式从 PHP 8.0.0 开始可用。

请参阅此处:https : //www.php.net/manual/en/control-structures.match.php

$var=0;
echo match ($var) {
    NULL=> 'a',
    default => 'b'
};
Run Code Online (Sandbox Code Playgroud)


Ada*_*ght 7

不是switch- 它只进行所谓的"松散"比较.您可以随时if/else if使用块替换它===.


the*_*mel 6

这是“严格”开关语句中的原始代码:

switch(true) {
    case $var === null:
        return 'a';
    default:
        return 'b';
}
Run Code Online (Sandbox Code Playgroud)

这也可以处理更复杂的switch语句,如下所示:

switch(true) {
    case $var === null:
        return 'a';
    case $var === 4:
    case $var === 'foobar':
        return 'b';
    default:
        return 'c';
}
Run Code Online (Sandbox Code Playgroud)