PHP宽松的类型系统提供了许多不同的方法来检测一个变量的值。然而这也造成了很多问题。 使用==
来检测一个值是否为null或false,如果该值实际上是一个空字符串或0,也会误报为false。isset是检测一个变量是否已赋值, 而不是检测该值是否为null或false,因此在这里使用是不恰当的。
is_null()函数能准确地检测一个值是否为null,is_bool可以检测一个值是否是布尔值(比如false),但存在一个更好的选择:===
操作符。===
检测两个值是否同一, 这不同于PHP宽松类型世界里的相等。它也比is_null()和is_bool()要快一些,并且有些人认为这比使用函数来做比较更干净些。
$x = 0; $y = null; // Is $x null? if($x == null) print('$x is 0, not null!'); // Is $y null? if(is_null($y)) print('$y is null,可以使用===更快的语句'); if($y === null) print('Perfect!'); //来下面一个大坑 if(strpos('abc', 'a')) // 上面找到a的位置是0,所以if判断不会通过下面这句 print('哦,没找到a'); //使用 !==进行值和类型的对比 if(strpos('abc', 'a') !== false) print('这才是正确的');
小结
- 测试一个返回0或布尔false的函数的返回值时,如strpos(),始终使用
===
和!==
,否则你就会碰到问题。