isset
isset只有在变量是null的时候返回false 其他任何时候返回true
(php中认为变量是null的情况 1、未赋值或初始化的变量。2、赋值为null的变量)
$null = null;
$num = 0;
$str = '';
$bool = false;
var_dump(isset($null)); // false
var_dump(isset($num)); // true
var_dump(isset($str)); // true
var_dump(isset($bool)); // true
empty
empty判断变量为空的情况 有5种情况会返回true
1、空字符串 ''
2、数字零 0
3、bool值 false
4、null
5、字符串零 '0'
$null = null;
$num = 0;
$str = '';$bool = false;var_dump(empty($null)); // true
var_dump(empty($num)); // true
var_dump(empty($snum)); // true
var_dump(empty($str)); // true
var_dump(empty($bool)); // true
总结:
isset只有在值为null时候人为没有设置值 返回false
empty会对5种情况判定为空值
注意:这两个函数的参数只能是变量不能是常量
empty(0)
empty('abc')
isset(null)
这样的写法是会报错的
2015-11-12 更新
空对象 和多层数组在 empty 中是不会返回 true 的
空对象返回的是一个资源
多层空数组是有 key 的
数组如果需要检测是否为空需要先过滤下数组 array_filter
class a{}
$a = new a;
// $a = array();
// $a = array(array(),array());
/*
empty :
空对象返回 false
多层空数组返回 false
单层空数组返回 true
*/
var_dump(empty($a));
die;
更新 2015-11-19
empty isset 最多的用处是在controller端 处理用户请求的数据
去除xss的情况 着重讨论下数组的情况
数组 $array = array()
当我们需要数组中的一个数据的时候都是 $array[$key] 这样的形式( 多位数组也是这样 )
一般还会赋值给一个变量方便以后的使用
但是 当 这个key在数组中不存在 php notic会报错 Notice: Undefined index:
所以在赋值前会对数据进行检测 检测key是否存在 检测数据是否为空 空字符串 或者 null 等 不需要的数据
对数组的处理用到的函数有3中 array_key_exists isset empty
array_key_exists
只能检查数组中是否存在key值
isset
可以检测数组中是否存在key值 如果不存在 数组 $arr['key'] 就是一个未赋值的变量 就是 NULL
isset 就会返回false
但如果 key 存在 且这个数组的对应的key值就是 NULL isset 同样返回false
所以 仅仅检测数组是否存在key 要用 array_key_exists 用isset来判断是不靠谱的
isset 多一个条件就是 当key存在且里面的值是NULL 的情况
empty
当数组中的key 不存在时候 作用如同 isset
当key存在 且里面的值是 NULL false 0 '' '0' 这五种情况也会返回 true
总结
array_key_exists 仅判断数组key是否存在
isset 判断数组key是否存在 或者 数组key存在 里面的值是 NULL
empty 判断数组key是否存在 且里面的值是 NULL false 0 '' '0'
特殊情况 上面提到的数组key多是string 当key数数字的情况就会出现一种特殊情况 看这个 http://blog.csdn.net/fanyilong_v5/article/details/38989421
$array('aef','bcd');
echo $array[1][2] == 'd'
这时候就只能用 array_key_exists 这个函数