php中数据类型的严格比较 === 分析
来源:互联网 发布:九搜网络用户中心 编辑:程序博客网 时间:2024/05/17 22:06
php作为弱类型语言有一些关于值的事情需要额外注意下:
空字符串 ''、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 falseit is falseit is falseit is falseit 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><?phpecho '<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) ""NULLint(0)bool(false)string(1) "0"string(0) ""---bool(true)bool(true)bool(true)bool(false)NULLbool(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整型intfalse布尔型boolNULLNULLphp中若要进行强类型的比较用到的是 === (等于) 与 !== (不等)
例子:
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 0stripos返回的数据类型: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
(包括任何资源)。
参数 ¶
input
要循环的数组
callback
使用的回调函数
如果没有提供
callback
函数, 将删除input
中所有等值为FALSE
的条目。更多信息见转换为布尔值。
代码:
var_dump(array_filter(array(array(),array(),array(),array(),array())));
结果:
array(0) {}
用array_filter 检测空数组是个好办法, 不然上面的那种多维空数组会在count的时候返回 5!
- php中数据类型的严格比较 === 分析
- ==比较数据类型数据
- Java中==、equals()和hashCode()的比较分析
- java中==与equals的比较分析
- Java中==、equals()和hashCode()的比较分析
- php数据类型比较转换
- PHP中变量的数据类型
- 比较严格的JS身份证校验
- 严格设置php中session过期时间
- SQL Server中数据类型的比较
- matlab的几种边缘检测算子的比较分析http://www.kongzhi.net/cases/caseview.php?id=2368
- Js中严格模式和非严格模式的区别
- PHP---史上最严格的身份证验证
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- PHP中基本数据类型的特点
- php中变量的数据类型转换
- php中变量的数据类型判断函数
- php字符串比较用==的一个教训
- 多线程同步中的wait,notify,notifyAll方法的深入学习
- Ubuntu下安装jdk
- 【Unity】技巧集合
- Windows下popush的平台部署——乔春雨
- 浅入浅出-XML
- php中数据类型的严格比较 === 分析
- hashMap如何遍历
- 学习二进制有感~
- cocos2d-x CCArray用法 遍历和删除元素
- PHP读取图片数据原理与实现
- 设计一个不能被继承的类
- ubuntu 安装VmTool
- 赵呆呆,Fight!
- qml