php中数据类型的严格比较 === 分析
2014-10-07 22:38
357 查看
php作为弱类型语言有一些关于值的事情需要额外注意下:
空字符串 ''、null、数字 0、bool值 false、字符型 '0'
1、这五个类型的数据在进行if判断的时候都会被当作false处理
测试代码如下:
运行结果:
注意 if('0') 也会被当作 false处理
2、在进行变量比较(非严格比较)的时候 这五个变量会被认为是相等的 其中
空字符串''与字符串零'0' 由于是同类型,比较结果是false
NULL与字符型数字零 '0' 比较结果是false
测试代码:
运行结果:
以上证明。
其中 false 、null 、数字0 、空字符串'' 这四个值在empty函数中返回true
参见 empty与isset用法区别
3、在强类型语言中是不会有这种情况的
php中若要进行强类型的比较用到的是 === (等于) 与 !== (不等)
例子:
int stripos(string $haystack, string $needle) 这个函数是查找 字符串$needle在$haystack中出现的位置索引
查找不到返回bool型数据false
测试代码:
运行结果:
明明返回的是int型的0,不是bool型的false,说明查找成功,但是程序确实查找失败
问题出在 if($ret == false)
如上面的介绍,在若类型的判断中,数字零 0 与布尔类型false是相等的
应该修改为 if($ret === false)
对上面的五个特殊值进行严格比较(===)测试
代码如下:
运行结果:
string(0) "" 与NULL 的比较结果:bool(false)
string(0) "" 与int(0) 的比较结果:bool(false)
string(0) "" 与bool(false) 的比较结果:bool(false)
string(0) "" 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
NULL 与string(0) "" 的比较结果:bool(false)
NULL 与int(0) 的比较结果:bool(false)
NULL 与bool(false) 的比较结果:bool(false)
NULL 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
int(0) 与string(0) "" 的比较结果:bool(false)
int(0) 与NULL 的比较结果:bool(false)
int(0) 与bool(false) 的比较结果:bool(false)
int(0) 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
bool(false) 与string(0) "" 的比较结果:bool(false)
bool(false) 与NULL 的比较结果:bool(false)
bool(false) 与int(0) 的比较结果:bool(false)
bool(false) 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
string(1) "0" 与string(0) "" 的比较结果:bool(false)
string(1) "0" 与NULL 的比较结果:bool(false)
string(1) "0" 与int(0) 的比较结果:bool(false)
string(1) "0" 与bool(false) 的比较结果:bool(false)
-------------------------------------------
在严格比较下他们都是不相等的,所以在使用的时候请注意。
-----------------更新-----------------
看到php手册中被转换成bool值false的一些情况
当转换为 boolean 时,以下值被认为是
布尔值
整型值 0(零)
浮点型值 0.0(零)
空字符串,以及字符串 "0"
不包括任何元素的数组
不包括任何成员变量的对象(仅 PHP
4.0 适用)
特殊类型 NULL(包括尚未赋值的变量)
从空标记生成的 SimpleXML 对象
所有其它值都被认为是
这个是在看到 array_filter 这个函数时候看到的
要循环的数组
使用的回调函数
如果没有提供
将删除
不提供callback时候 空数组会转换为false
代码:
var_dump(array_filter(array(array(),array(),array(),array(),array())));
结果:
用array_filter 检测空数组是个好办法, 不然上面的那种多维空数组会在count的时候返回 5!
空字符串 ''、null、数字 0、bool值 false、字符型 '0'
1、这五个类型的数据在进行if判断的时候都会被当作false处理
测试代码如下:
// 空字符串、null、数字0、bool值 false、字符型0 $var_list = array('',null,0,false,'0'); foreach($var_list as $tag) { if($tag) { echo 'it is true<br>'; } else { echo 'it is false<br>'; } }
运行结果:
it is false it is false it is false it is false it is false
注意 if('0') 也会被当作 false处理
2、在进行变量比较(非严格比较)的时候 这五个变量会被认为是相等的 其中
空字符串''与字符串零'0' 由于是同类型,比较结果是false
NULL与字符型数字零 '0' 比较结果是false
测试代码:
<?php $var_list = array('',null,0,false,'0'); $count = count($var_list); $result=array(); for($i=0;$i<$count;$i++) { $key = dump($var_list[$i]); $result[$key]=array(); for($k=0;$k<$count;$k++) { if($i==$k) { $result[$key][]='---'; continue; } else { $result[$key][]=dump($var_list[$i],$var_list[$k]); } } } // dump升级版本 function dump($v1,$v2='1') { ob_start(); if($v2==1) { var_dump($v1); } else { var_dump($v1==$v2); } return ob_get_clean(); } ?> <!--比较结果的表格--> <style type="text/css"> td{width: 150px;line-height: 60px;text-align: center;} </style> <table border=1> <?php echo '<tr><td></td>'; foreach($var_list as $var) { echo '<td>'.dump($var).'</td>'; } echo '</tr>'; foreach($result as $k=>$v) { echo '<tr>'; echo '<td>'.$k.'</td>'; foreach($v as $i) { echo '<td>'.$i.'</td>'; } echo '</tr>'; } ?> </table>
运行结果:
string(0) "" | NULL | int(0) | bool(false) | string(1) "0" | |
string(0) "" | --- | bool(true) | bool(true) | bool(true) | bool(false) |
NULL | bool(true) | --- | bool(true) | bool(true) | bool(false) |
int(0) | bool(true) | bool(true) | --- | bool(true) | bool(true) |
bool(false) | bool(true) | bool(true) | bool(true) | --- | bool(true) |
string(1) "0" | bool(false) | bool(false) | bool(true) | bool(true) | --- |
其中 false 、null 、数字0 、空字符串'' 这四个值在empty函数中返回true
参见 empty与isset用法区别
3、在强类型语言中是不会有这种情况的
空字符串 '' 字符串零 '0' | 字符串类型 | string |
数字零 0 | 整型 | int |
false | 布尔型 | bool |
NULL | NULL |
例子:
int stripos(string $haystack, string $needle) 这个函数是查找 字符串$needle在$haystack中出现的位置索引
查找不到返回bool型数据false
测试代码:
$haystack='fantasy is my name'; $needle='fan'; $ret = stripos($haystack, $needle); echo 'start at index '.$ret.'<br>stripos返回的数据类型:'; var_dump($ret); echo '<br><br>'; if($ret==false) // 返回的是false的话 { echo '查找失败<br>'; } else { echo '查找成功<br>'; }
运行结果:
start at index 0 stripos返回的数据类型:int(0) 查找失败
明明返回的是int型的0,不是bool型的false,说明查找成功,但是程序确实查找失败
问题出在 if($ret == false)
如上面的介绍,在若类型的判断中,数字零 0 与布尔类型false是相等的
应该修改为 if($ret === false)
对上面的五个特殊值进行严格比较(===)测试
代码如下:
// 空字符串、null、数字0、bool值 false、字符型0 $var_list = array('',null,0,false,'0'); $count = count($var_list); for($i=0;$i<$count;$i++) { for($k=0;$k<$count;$k++) { if($i==$k) continue; var_dump($var_list[$i]);echo '与'; var_dump($var_list[$k]);echo "的比较结果:<span style='color:red;font-weight:800;font-size:28px;'>"; var_dump($var_list[$i]===$var_list[$k]); echo '</span><br><br>'; } echo '-------------------------------------------<br><br>'; }
运行结果:
string(0) "" 与NULL 的比较结果:bool(false)
string(0) "" 与int(0) 的比较结果:bool(false)
string(0) "" 与bool(false) 的比较结果:bool(false)
string(0) "" 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
NULL 与string(0) "" 的比较结果:bool(false)
NULL 与int(0) 的比较结果:bool(false)
NULL 与bool(false) 的比较结果:bool(false)
NULL 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
int(0) 与string(0) "" 的比较结果:bool(false)
int(0) 与NULL 的比较结果:bool(false)
int(0) 与bool(false) 的比较结果:bool(false)
int(0) 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
bool(false) 与string(0) "" 的比较结果:bool(false)
bool(false) 与NULL 的比较结果:bool(false)
bool(false) 与int(0) 的比较结果:bool(false)
bool(false) 与string(1) "0" 的比较结果:bool(false)
-------------------------------------------
string(1) "0" 与string(0) "" 的比较结果:bool(false)
string(1) "0" 与NULL 的比较结果:bool(false)
string(1) "0" 与int(0) 的比较结果:bool(false)
string(1) "0" 与bool(false) 的比较结果:bool(false)
-------------------------------------------
在严格比较下他们都是不相等的,所以在使用的时候请注意。
-----------------更新-----------------
看到php手册中被转换成bool值false的一些情况
当转换为 boolean 时,以下值被认为是
FALSE:
布尔值
FALSE本身
整型值 0(零)
浮点型值 0.0(零)
空字符串,以及字符串 "0"
不包括任何元素的数组
不包括任何成员变量的对象(仅 PHP
4.0 适用)
特殊类型 NULL(包括尚未赋值的变量)
从空标记生成的 SimpleXML 对象
所有其它值都被认为是
TRUE(包括任何资源)。
这个是在看到 array_filter 这个函数时候看到的
参数 ¶
input
要循环的数组
callback
使用的回调函数
如果没有提供
callback函数,
将删除
input中所有等值为
FALSE的条目。更多信息见转换为布尔值。
不提供callback时候 空数组会转换为false
代码:
var_dump(array_filter(array(array(),array(),array(),array(),array())));
结果:
array(0) {}
用array_filter 检测空数组是个好办法, 不然上面的那种多维空数组会在count的时候返回 5!
相关文章推荐
- php笔记之:数据类型与常量的使用分析
- PHP两个字符串比较(人为出错),两字符串类型和数据表面相等,但strcmp()结果不为0
- php笔记之:数据类型与常量的使用分析
- php 数据类型转换与比较
- PHP之——不同类型数据之间的比较规律
- php数据类型比较转换
- 内存级分析,基本数据类型,引用数据类型 比较是否相等
- C++浮点数(float、double)类型数据比较、转换分析总结
- PHP数据类型的总结分析
- php中浮点类型数据的比较
- JAVA和PHP的数据类型比较
- 关于mysql数据表myisam与innode两种类型的比较分析
- PHP数据类型的总结分析
- php数据类型比较、属性对照表
- PHP的5种基本数据类型
- [Python]Python/PHP如何查询sql server中NTEXT类型数据
- PHP - Manual手册 - 附录 Q. PHP 类型比较表 - 表 Q.2. 用 == 进行松散比较
- 用PHP输出MySQL中的timestamp数据类型
- oracle数据类型分析
- Visual Basic、C# 和 C++ 的数据类型比较(转)