php中数据类型的比较,php中数据类型的严格比较 === 分析

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

}

else

{

echo 'it is false
';

}

}

运行结果:

it is false

it is false

it is false

it is false

it is false

注意 if('0') 也会被当作 false处理

2、在进行变量比较(非严格比较)的时候 这五个变量会被认为是相等的 其中

空字符串''与字符串零'0' 由于是同类型,比较结果是false

NULL与字符型数字零 '0' 比较结果是false

测试代码:

$var_list = array('',null,0,false,'0');

$count = count($var_list);

$result=array();

for($i=0;$i

{

$key = dump($var_list[$i]);

$result[$key]=array();

for($k=0;$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();

}

?>

td{width: 150px;line-height: 60px;text-align: center;}

echo '

';

foreach($var_list as $var)

{

echo '

'.dump($var).'';

}

echo '

';

foreach($result as $k=>$v)

{

echo '

';

echo '

'.$k.'';

foreach($v as $i)

{

echo '

'.$i.'';

}

echo '

';

}

?>

运行结果:

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

3、在强类型语言中是不会有这种情况的

空字符串 '' 字符串零 '0'

字符串类型

string

数字零 0

整型

int

false

布尔型

bool

NULL

NULL

php中若要进行强类型的比较用到的是 === (等于) 与 !== (不等)

例子:

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.'
stripos返回的数据类型:';

var_dump($ret);

echo '
';

if($ret==false) // 返回的是false的话

{

echo '查找失败
';

}

else

{

echo '查找成功
';

}

运行结果:

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

{

for($k=0;$k

{

if($i==$k) continue;

var_dump($var_list[$i]);echo '与';

var_dump($var_list[$k]);echo "的比较结果:";

var_dump($var_list[$i]===$var_list[$k]);

echo '
';

}

echo '-------------------------------------------
';

}

运行结果:

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的一些情况

当转换为 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!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值