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!