使开关使用===比较不==比较在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' ?>
现场演示
你可以这样做的一个方法是做我认为是一个倒退开关(可能有一个更正式的名称)。 这个想法是,你把true
或false
的顶部,然后在条件陈述的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
情况)。