PHP isset()与empty()的使用区别详解


Posted in PHP onAugust 29, 2010

PHP的isset()函数 一般用来检测变量是否设置
格式:bool isset ( mixed var [, mixed var [, ...]] )

功能:检测变量是否设置

返回值:

若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
版本:PHP 3, PHP 4, PHP 5
更多说明:
使用 unset() 释放变量之后,它将不再是 isset()。
PHP函数isset()只能用于变量,传递任何其它参数都将造成解析错误。
检测常量是否已设置可使用 defined() 函数。

PHP的empty()函数 判断值为否为空

格式:bool empty ( mixed var )

功能:检查一个变量是否为空

返回值:

若变量不存在则返回 TRUE
若变量存在且其值为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 TURE
若变量存在且值不为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 FALSE
版本:PHP 3, PHP 4, PHP 5
更多说明:
empty()的返回值=!(boolean) var,但不会因为变量未定义而产生警告信息。参见转换为布尔值获取更多信息。
empty() 只能用于变量,传递任何其它参数都将造成Paser error而终止运行。
检测常量是否已设置可使用 defined() 函数。
例子: empty() 与 isset() 的一个简单比较

<?php 
$var = 0; 
// 结果为 true,因为 $var 为空 
if (empty($var)) { 
echo '$var is either 0 or not set at all'; 
} 
// 结果为 false,因为 $var 已设置 
if (!isset($var)) { 
echo '$var is not set at all'; 
} 
?>

注: 由于这是一个语言结构而非函数,因此它无法被变量函数调用。
注: empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用: empty(addslashes($name))。
下面是经过三水点靠木测试过的一段isset与empty函数详细例子的代码,看完这个基本上就差不多了:
<?php 
error_reporting(E_ALL); 
echo '<B>未定义$var</b><Br>'; 
echo "isset测试:<Br>"; 
if ( isset ( $var )) 
{ 
echo '变量$var存在!<Br>' ; 
} 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
} 
else 
{ 
echo '变量$var的值不为空<Br>'; 
} 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
} 
else { 
echo '变量$var不存在!<Br>'; 
} 
echo '----------------------------------<br>'; 
echo '<B>$var = \'\'</b><Br>'; 
echo "isset测试:<Br>"; 
$var = ''; 
if ( isset ( $var )) 
{ 
echo '变量$var存在!<Br>' ; 
} 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
} 
else 
{ 
echo '变量$var的值不为空<Br>'; 
} 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
} 
else { 
echo '变量$var不存在!<Br>'; 
} 
echo '----------------------------------<br>'; 
echo '<B>$var = 0</b><Br>'; 
echo 'isset测试:<Br>'; 
$var = 0 ; 
if ( isset ( $var )) 
{ 
echo '变量$var存在!<Br>' ; 
} 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
} 
else 
{ 
echo '变量$var的值不为空<Br>'; 
} 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
} 
else { 
echo '变量$var不存在!<Br>'; 
} 
echo '----------------------------------<br>'; 
echo '<B>$var = null</b><Br>'; 
echo 'isset测试:<Br>'; 
$var = null ; 
if ( isset ( $var )) 
{ 
echo '变量$var存在!<Br>' ; 
} 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
} 
else 
{ 
echo '变量$var的值不为空<Br>'; 
} 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
} 
else { 
echo '变量$var不存在!<Br>'; 
} 
echo '----------------------------------<br>'; echo '<B>$var ="php"</b><Br>'; 
echo 'isset测试:<Br>'; 
$var = "php"; 
if ( isset ( $var )) 
{ 
echo '变量$var存在!<Br>' ; 
} 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
} 
else 
{ 
echo '变量$var的值不为空<Br>'; 
} 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
} 
else { 
echo '变量$var不存在!<Br>'; 
} 
?>

在使用 php 编写页面程序时,我经常使用变量处理函数判断 php 页面尾部参数的某个变量值是否为空,开始的时候我习惯了使用 empty() 函数,却发现了一些问题,因此改用 isset() 函数,问题不再。
顾名思义,empty() 判断一个变量是否为“空”,isset() 判断一个变量是否已经设置。正是这种所谓的“顾名思义”,令我开始时走了些弯路:当一个变量值等于0时,empty()也会成立(True),因而会发生 一些意外。原来,empty() 和 isset() 虽然都是变量处理函数,它们都用来判断变量是否已经配置,它们却是有一定的区别:empty还会检测变量是否为空、为零。当一个变量值为0,empty() 认为这个变量同等于空,即相当于没有设置。
比如检测 $id 变量,当 $id=0 时,用empty() 和 isset() 来检测变量 $id 是否已经配置,两都将返回不同的值—— empty() 认为没有配置,isset() 能够取得 $id 的值:

$id=0; 
empty($id)?print "It's empty .":print "It's $id ."; 
//结果:It's empty . 
print "<br>"; 
!isset($id)?print "It's empty .":print "It's $id ."; 
//结果:It's 0 .

这意味着,我们在使用变量处理函数时,当该变量可能出现0的值,使用 empty() 要小心,这个时候用 isset 取代它更明智一些。
当一个php页面的 URL 尾部参数出现 id=0 时(比如:test.php?id=0),试比较:

if(empty($id)) $id=1; - 若 id=0 ,id 也会为1 
if(!isset($id)) $id=1; - 若 id=0 ,id 不会为1

可分开运行以下代码检测上述推断:

if(empty($id)) $id=1; 
print $id; // 得到 1 
if(!isset($id)) $id=1; 
print $id; //得到 0

要说它们的联系,其共同点就是empty()和 isset()都是变量处理函数,作用是判断变量是否已经配置,正是由于它们在处理变量过程中有很大的相似性,才导致对它们的关系认识不足。单从 empty()和isset()这两个函数本身来考虑的话会把人弄得更糊涂,换一个角度来它。empty()和isset()的处理对象无外乎未定义变量,0,空字符串。
如果变量为0,则empty()会返回TRUE,isset()会返回TRUE;

如果变量为空字符串,则empty()会返回TRUE,isset()会返回TRUE;
如果变量未定义,则empty()会返回TRUE,isset()会返回FLASE;

手册中对empty()的解释如下:

描述bool empty( mixed var )
如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,”"、0、”0″、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
手册中对isset()的解释如下:

isset()检测变量是否设置

描述bool isset ( mixed var [, mixed var [, ...]] )

如果 var 存在则返回 TRUE,否则返回 FALSE。

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”?”)并不等同于 PHP 的 NULL 常数。
警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined()函数。

当要 判断一个变量是否已经声明的时候 可以使用 isset 函数
当要 判断一个变量是否已经赋予数据且不为空 可以用 empty 函数
当要 判断 一个变量 存在且不为空 先isset 函数 再用 empty 函数

PHP 相关文章推荐
phpBB BBcode处理的漏洞
Oct 09 PHP
谈谈新手如何学习PHP 默默经典版本
Aug 04 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
Oct 13 PHP
Laravel框架源码解析之入口文件原理分析
May 14 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 #PHP
php下统计用户在线时间的一种尝试
Aug 26 #PHP
PHP生成excel时单元格内换行问题的解决方法
Aug 26 #PHP
PHP下对字符串的递增运算代码
Aug 21 #PHP
深入理解PHP原理之异常机制
Aug 21 #PHP
php中var_export与var_dump的区别分析
Aug 21 #PHP
php visitFile()遍历指定文件夹函数
Aug 21 #PHP
You might like
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
js资料toString 方法
2007/03/13 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
深入理解Django的自定义过滤器
2017/10/17 Python
利用Python循环(包括while&amp;for)各种打印九九乘法表的实例
2017/11/06 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
python标识符命名规范原理解析
2020/01/10 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
shell程序中如何注释
2012/01/28 面试题
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
单位接收函格式
2015/01/30 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python