PHP判空,判断真值,很基础,使用更是频繁。但由于PHP比较松散的语言风格,也容易造成理解混乱。
本文来总结和分析相关的知识,相信看完之后你应该能对这部分的知识有一个比较清晰的理解。
下面的表格是我们在写PHP程序中,做分支条件判定时,经常用到的函数或者表达式,
在对变量做了一些典型的设置或者赋值,然后得到最终判空和判定真值的结果。
通过上面的表格,做几点分析和总结:
1. isset 用于检测变量是否已设置。
变量定义未赋值、赋值null、未定义,isset会返回false。(注意,表中isset有取反运算符,是为了对比方便)。
unset 释放一个变量后,isset 返回false。
如果isset 有多个参数,则所有参数变量被设置,才返回true。检测从左至右开始,遇到未设置变量即返回false。
注意:
(1)isset 是语言结构,不是函数,所以不能被可变函数调用。
(2)isset 只能用于变量,传递其他任意参数将导致解析错误。检测常量,使用defined函数。
(3)对于 $arr = array('key'=>null); isset($arr['key']) 将返回false,如果要坚持键值是否存在,使用 array_key_exists。
2.empty 用于判定变量值是否为空。
“空”的定义:当一个变量不存在,或者它的值等同于false。
首先isset返回false的,empty会返回true。
除此之外,空数组、空字符串、null、布尔值false、整型值0、字符串值0、浮点数0.0、不包含任何属性的对象都认为是空。
即: empty() 本质上等价于与 ! isset($var) || $var == false
注意:
(1)empty 是语言结构,不是函数,所以不能被可变函数调用。
(2)如果变量不存在,empty 不会产生告警。
(3)在PHP5.5之前,empty 仅支持变量,参数传入非变量值,将导致解析错误。
empty在PHP5.5开始支持表达式。
3. is_null 检测变量是否null
什么时候变量为null:变量被赋值为null、变量未定义或定义未初始化、变量被unset。
看起来 和 isset 取反一致,另外 $var === null,从效果上看,也一致。
区别是:
is_null 是函数,isset 是语言结构,$var === null 是表达式,所以后两者速度要快,但是is_null具有函数的特征。
4. 等于 和 恒等
等于不需要比较类型,所以相对于恒等就比较宽松。由于等于不比较类型,如果类型不一致,则需要做类型转换。
字符串和整型比较,字符串会转换成整型,如:
$php -r '$var = ""; var_dump((int)$var);'
int(0)
所以变量值为整型0与空字符做相等比较得到的是true。
(BTW: 如果比较两个数字字符串,是转换成数字之后再比较的。)
NULL和字符串比较,NULL会被转换成空字符串('\0');
$php -r 'var_dump((string)NULL);'
string(0) ""
布尔值和字符串比较,false会被转换成空字符串。
$php -r 'var_dump((string)false);'
string(0) ""
注意ture会被转换成"1"。
$php -r 'var_dump((string)true);'
string(1) "1"
恒等首先比较的是类型,类型不一致直接返回false,类型一致再比较值。
5. if ($var)
整型0、布尔值false,返回false;整型非0、布尔值true返回true 没什么悬念,C语言也是这么处理的。
非空的数组返回true,这应该是类型转换有关系,可以试试:
$php -r '$var = array(); var_dump((bool)$var);'
bool(false)
$php -r '$var = array(1); var_dump((bool)$var);'
bool(true)
而其他类型值:
$php -r '$var = ""; var_dump((bool)$var);'
bool(false)
$php -r '$var = NULL; var_dump((bool)$var);'
bool(false)
要注意一个比较特别的,字符串0。
php -r '$var = "0"; var_dump((bool)$var);'
bool(false)
参考:
《PHP 手册》
阅读(2729) | 评论(0) | 转发(0) |