php isset函数对比empty函数之间的区别及其使用方法

来源:互联网 发布:推广软件拦截 编辑:程序博客网 时间:2024/04/30 07:08

php中empty函数和isset函数经常会用到,而且两者出现的频率不低,两个有相似的地方,但实质上有很大的区别,严格区分两者非常重要。


empty函数用来检测变量是否为空,而isset函数用来检测函数是否设置且是不是为null,这是两者重要的区别,可能光说还不能很好的理解,下面来看例子。


首先来看isset函数

isset的官方解释:determine if a variable is set and is not null //判断一个变量是否被设置同时变量不为null

bool isset(mixed $var,[ ,mixed $... ] );


范例:

<?php$str1;$str2="";$str3="hello";var_dump(isset($str0));var_dump(isset($str1));var_dump(isset($str2));var_dump(isset($str3));
得到的结果是 false false true true


来分析一下:

isset官方手册写的:  bool isset(mixed $val [,mixed $var...]);  


第一个$str0没有设置,isset检测的结果没有设置返回false,这个一般都没有疑问。


第二个$str1设置了,但是没有赋值,这种情况$str1为null,虽然isset检测结果是设置了该变量,但是由于值为null,因此也为false,这里是容易出错的地方,因为很多人认为isset只检测变量是否设置了,既然设置了,肯定就为true,这是错误的,即便变量设置了,如果为null的话也是为false的。


第三个检测结果是存在,而变量$str2为空值,因此isset结果是true,第四个同理,因此也是true。


可以看出isset检测的是变量是否存在,且是不是为null,如果没有设置或者值为null则为false,不是则为true


isset可以进行多个变量的检测

如果是多个变量的检测,那么必须所有的变量都存在且不为null的时候才能为true,否则为false

例如上面的的例子的$str1和$st2一起使用isset检测,则为false,而$str2和$str3则为true。

unset过的变量,isset为false


下面来看看empty函数

官方手册的解释:determine whether a variable is empty //判断一个变量是不是为空值

bool empty(mixed $val)


范例:

<?php$str1=null;$str2='';$str3=0;$str4=false;$str5='abc';var_dump(empty($str0));var_dump(empty($str1));var_dump(empty($str2));var_dump(empty($str3));var_dump(empty($str4));var_dump(empty($str5));

得到的结果会是:true true true true true false


这里可能很容易产生误解,因为上面除了最后的$str5的变量为字符串'abc'外,其他都显示为true,也就是empty判断其为空,下面来看看官方对empty的详细描述:

determine whether a variable is considered to be empty,A variable is considered if it does not exist or if it's value equals FALSE.

empty does not generate a warning if the variable does not exist.

上面说的很明白,empty检测变量是值是否为空,如果不存在或者值为false则empty返回true,并且如果变量不存在,empty函数不会产生警告


从上面的解释就能看出上面的范例为什么结果是这样

$str0不存在,empty函数不会产生错误,变量值为空,所以返回true,

$str1存在,但值为null,因此被强制转换为bool值false,同上面的解释,如果值为false则为true,

$str2存在,但值为空,转换bool类型为false,返回true,

$str3存在,但值为0,0被转换成bool类型,为false,同上面的解释,如果值为false则为true,

$str4存在,但值为false,因此得到true,

$str5存在,值为字符串abc,不符合值为空或者值为false,因此empty函数返回false。


从这里可以观察到,其实empty函数会对检测的变量进行判断,判断的过程中会对变量的值进行检测,如果是bool值,根据bool值判断,如果不是bool值则进行强制转换为bool值再进一步进行判断。因此如果该变量的值转换成bool值时为false,则empty函数返回true,如果该变量的值转换成true,empty函数返回false。


详细解读如下:

如果变量不存在,empty函数将该变量强制转换bool类型,转换成false,empty函数返回true。

如果变量存在,但为null、0,、false、array()等强制转换bool类型过程中会得到false的变量,empty函数返回true。

如果变量存在,变量的值转换bool类型为true,则empty函数返回false。

这样来解读empty函数就清晰多了。


isset和empty对比

从上面的解读可以看出,isset()为false的情况,empty()得到的肯定为true。

isset适合于检测一个变量是否被设置了且是不是被初始化,如果变量没有被设置,或者设置了没有进行初始化则返回false,否则返回true。

而empty则适合检测一个变量是否进行了赋值且是不是初始默认值,如果该变量不存在或者该值是初始化的默认值,则认为该变量为空,返回true,否则返回false。由于php是不指定变量类型的,所以empty的使用尤其要小心,它可能由于使用方法不对,得到我们不想要的结果。


例如你想知道一个字符串类型的变量是不是存在,且是不是空值,如果该变量有赋值,但赋值的内容就是字符串的0的话,用empty是得不到想要的答案的,因为empty会自动认为字符串0是int类型的初始化值的默认值0,这个结论是错误的,这种情况应该使用isset进行判断该变量是否设置了,且是不是初始化,然后再判断该变量是不是字符串的初始化默认值' ',这样才能得到正确的结果。















0 0
原创粉丝点击