使开关使用===比较不==比较在PHP中

无论如何,使下面的代码仍然使用开关,并返回b不是? 谢谢!

 $var = 0; switch($var) { case NULL : return 'a'; break; default : return 'b'; break; } 

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

 $var = 0; if($var === NULL) return 'a'; else return 'b'; 

但是对于更复杂的例子来说,这变得冗长了。

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

请注意,开关/shell没有宽松的比较。

这意味着你将不得不提出一个解决方法。 从松散的比较表中 ,您可以利用NULL == "0"为false的事实通过types转换:

 <?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' ?> 

现场演示

你可以这样做的一个方法是做我认为是一个倒退开关(可能有一个更正式的名称)。 这个想法是,你把truefalse的顶部,然后在条件陈述的case

 switch(true) { case ($var === NULL): return 'a'; break; case ($var === 0): return 'b'; break; default: return 'c'; } 

不与switch – 它只做所谓的“宽松”比较。 您可以随时使用===将其replace为if/else if块。

  • 切换文档: http : //php.net/manual/en/control-structures.switch.php
  • 松散的比较: http : //php.net/manual/en/types.comparisons.php#types.comparisions-loose

想必你打开variables,期待整​​数。 为什么不使用is_int($val)事先简单地检查variables的整数状态?

使开关使用===比较不==比较在PHP中

不幸的是, switch使用宽松的比较,据我所知,没有办法改变这一点。

在PHP开关语句只松动比较(==)见http://www.php.net/manual/en/control-structures.switch.php

如果您需要严格比较,请使用if / elseif / else。

我只是用

 $var === null and $var = -1; // since switch is not type-safe switch ( $var ) { case 0: # this tests for zero/empty string/false break; case -1: # this tests for null break; } 

我认为这仍然看起来非常可读,如果以//开头的注释被留下(以#开始的注释可能是最好的)。

我有一个开关与string包含数字相同的问题(“15.2”等于“15.20”在开关为PHP)

我解决了在文字前加一个字母来比较的问题

 $var = '15.20'; switch ('#'.$var) { case '#15.2' : echo 'wrong'; break; case '#15.20' : echo 'right'; break; } 

不。 从手册页 :

请注意,开关/shell没有宽松的比较 。

如果你只有两个条件,使用if你喜欢你的第二个例子。 否则,先检查NULL然后再打开其他的可能性:

 if (is_null($var)) { return 'a'; } switch ($var) { // ... } 

这不可能。

但是,您可以将if语句放在 switch

 switch($var) { // Loose cases here case 0: if($var === NULL) { return 'a'; } // Fall through default: return 'b'; } 

或者干脆:

 switch($var) { // Loose cases here default: if($var === NULL) { return 'a'; } return 'b'; } 

您也可以打开variables的types:

 switch (gettype($var)) { ... } 

最好的方法之一是通过使用is_null来检查NULL值

 <?php echo getValue(); function getValue() { $var = 0; switch(true) { case is_null($var) : return 'a'; break; default : return 'b'; break; } } ?> 

从你的示例代码中推断,我猜你有一堆常规的案例和一个特例(这里是null )。

我能想出的最简单的办法就是在切换之前处理这种情况:

 if ($value === null) { return 'null'; } switch ($value) { case 0: return 'zero'; case 1: return 'one'; case 2: return 'two'; } 

也许还要添加一个注释来记住null会意外地匹配0情况(反之, 0会匹配一个null情况)。