PHP判断变量是否存在及函数isset() 、empty()与is_null的区别

时间:2022-06-01 03:54:32

一、举例说明

A.如何判断一个变量是否定义?

<?php
// 假设不存在$test 变量 if (isset($test))
{
echo '$test 已经set', '<br/>';
}
else
{
echo '$test 没有set', '<br/>';
} if (empty($test))
{
echo '$test 为empty', '<br/>';
}
else
{
echo '$test 不为empty', '<br/>';
} if (is_null($test))
{
echo '$test 为null', '<br/>';
}
else
{
echo '$test 不为null', '<br/>';
} if ($test)
{
echo '$test值为' . $test, '<br/>';
}
else
{
echo '$test没有值', '<br/>';
}

输出结果:

PHP判断变量是否存在及函数isset() 、empty()与is_null的区别

结果表明:

1、当变量未定义时,is_null()和“参数本身”是不允许作为参数判断的,会报Notice警告错误;

2、empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

3、isset():仅当null和未定义,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回false;

5、is_null():仅判断是否为null,未定义 报警告;

6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;

B.对空值的判断比较?

<?php
// 预定义变量数组:空字符,字符0,数组0,null,布尔false,空数组
$arrVars = array('', '0', 0, null, false, array()); foreach ($arrVars as $value)
{
echo '<br>传入值为:' . $value . '<br>';
if (!isset($value))
{
echo 'isset()==false<br>';
} if (empty($value))
{
echo 'empty()==true<br>';
} if (!$value)
{
echo 'self==false<br>';
} if (is_null($value))
{
echo 'is_null()==true<br>';
}
}

输出结果:

传入值为:
empty()==true
self==false 传入值为:0
empty()==true
self==false 传入值为:0
empty()==true
self==false 传入值为:
isset()==false
empty()==true
self==false
is_null()==true 传入值为:
empty()==true
self==false 传入值为:Array
empty()==true
self==false

结果表明:

""、0、"0"、NULL、FALSE、array()这几个中,empty()和“变量本身作为参数”结果一致,均作为“空”来处理,而isset()和is_null ()仅当是null时,才作为“空”来处理(值得注意的是false并不会被认为是空)

C、看下各自接收的参数是什么?

isset函数参数:

<?php
$test=100;
echo isset($test),isset(100),$isset($b=100);

输出:

<br />
<b>Parse error</b>: parse error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in <b>PHPDocument3</b> on line <b>3</b><br />

empty函数参数:

<?php
$test=100;
echo empty($test),empty(100),empty($b=100);

输出:

<br />
<b>Parse error</b>: parse error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in <b>PHPDocument3</b> on line <b>3</b><br />

is_null函数参数:

<?php
$test=100;
echo is_null($test),is_null(100),is_null($b=100);

运行结果:没有任何错误。

结果表明:

empty,isset输入参数必须是一个变量(PHP变量是以$字符开头的),而is_null输入参数只要是能够有返回值就可以(常量,变量,表达式等)。在PHP手册里面,对于他们解析是:empty,isset 是一个语言结构而非函数,因此它无法被变量函数调用。

二、概括总结isset,empty,is_null区别:

empty()

如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var、未定义,以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

isset()

如果 变量 存在且值非NULL,则返回 TRUE,否则返回 FALSE(包括未定义)。变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。

is_null()

检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定义变量传入后会出错!】。

empty(), is_null(), isset()真值表(区别)

PHP判断变量是否存在及函数isset() 、empty()与is_null的区别

三、isset详细介绍(应用场景举例)

1、isset()对PHP参数判断

您可以使用 PHP isset() 来判断一个参数是否被定义,注意如果该参数为空,或者"\n"(NULL字节)使用 PHP isset() 判断之后,都会为TRUE。

<?php
$var = ''; // 这里初始参数$var='';
$var0 = FALSE; // 这里初始参数为布尔FALSE
$var2 = NULL; // 这里定义$var2=NULL,用isset()判断返回FALSE
$var3 = "\0"; // 这里是NULL字节,用isset()判断,返回TRUE,不同于NULL常数
$var4 = "blog.snsgou.com"; // 这里定义会在下面给unset掉 if (isset($var))
{
echo '参数$var已经设定,且值不为NULL';
}
// 参数$var已经赋值,而且值为$var='',所以会输出“参数$var已经设定” if (isset($var0))
{
echo '参数$var0已经设定,且值不为NULL';
}
// 参数$var0已经赋值,而且值为$var=FALSE,所以会输出“参数$var已经设定” if (isset($vget))
{
echo '参数$vget已经设定,且值不为NULL';
}
// 参数$vget根本就没有被提及过,isset($vget)返回FALSE,不会输出 if (isset($var2))
{
echo '参数$var2已经设定,且值不为NULL';
}
// 这里是$var2虽然被设定了,但是$var2=NULL,所以isset($var2)返回FALSE,不会输出 if (isset($var3))
{
echo '参数$var3已经设定,且值不为NULL';
}
// 参数$var3 虽然\0 就是代表NULL字节,但是这个不是常数NULL,所以$isset("\0")返回TRUE,会输出 unset($var4); // 这里给$var4 释放掉了
if (isset($var4))
{
echo '参数$var4已经设定,且值不为NULL';
}
// 虽然开始已经定义$var4,而且还不为NULL,但是后来又给 unset() 掉了,所以不会输出。

2、PHP isset() 对数组的判断

在使用PHP数组的时候,需要判断数组的某个值是否存在也可以使用 PHP isset() 函数。

<?php
$V => array(
'aa' => 'blog.snsgou.com',
'bb' => array(
'file' => 'file.snsgou.com',
'img' => 'img.snsgou.com',
'hosts' => array(
'blog' => 'blog.snsgou.com',
'res' => 'res.snsgou.com'
)
)
); // var_dump用于输出TRUE 或 FALSE var_dump(isset($V['aa']));
// 数组$V 的$V['aa'] ='blog.snsgou.com'已经存在,所以输出TRUE var_dump(isset($V['bb']['file']));
//$V['bb']['file'] = 'file.snsgou.com' 所以输出 TRUE var_dump(isset($V['bb']['hosts']['blog']));
// $V['bb']['hosts']['blog']='blog.snsgou.com'所以输出TRUE var_dump(isset($V['bb']['hosts']['sh']));
//根据数组,根本就没有设定该项,所以输出FALSE
?>

3、PHP isset()对参数判断

很多时候我们需要对多个参数进行判断,可以使用isset($A)&&isset($B)……来判断这些参数是不是都已经设定了,而且都不为NULL,对此您可以使用isset()多参数来判断是不是都设定了。

<?php
isset($v1)&&isset($v2)&&isset($v3)……
// 等价于
isset($v1,$v2,$v3……)
?>

使用isset()判断多个参数,需要所有参数都被设定,且不为NULL,只要其中有一个参数没有被设定过,或者为NULL,那么整个isset()就为FALSE。

4、PHP isset()判断$_POST、$_GET、$_REQUEST等值

用isset() 或者empty() 判断通过表单传递来的参数是isset() 最常见的用法。

<?php
if (isset($_POST['from']) && 'snsgou.com' == $_POST['from'])
{
echo '网站通过POST传递的来源是snsgou.com';
}

根据上面我们可以用isset判断多参数,在对表单传递来的值进行判断就最方便了。

<?php
// 表单传递来user用户名和 pass必须同时存在才能执行
if (isset($_POST['user'], $_POST['pass']))
{
$user = $_POST['user'];
$pass = $_POST['pass'];
echo '您填写的用户名是:', $user, ';密码是:', $pass;
}

5、PHP isset($var{字符串长度}) 判断字符串长度

用PHP判断字符串是否存在或者判断字符串长度是否超过某一数字或者判断字符串长度是否为空一般使用strlen(),但是其实使用isset()性能更优越。

<?php
// 三元,等同于 if (isset($_POST['from'])) { $var = $_POST['from'];} else {$weiget = '';} $var = isset($_POST['from']) ? $_POST['from'] : ''; // 判断$var存在,且字符串长度大于0
/* 菜鸟写法
if (strlen($var) > 0)
{
echo '$var子符长度大于0';
}
*/ // 性能更优越的写法,判断$var第1个字符是否设定了
if (isset($var{1}))
{
echo '$var字符长度大于0';
}

6、PHP isset() 与 PHP empty() 的区别

很多人都拿 PHP isset() 和 PHP empty()进行比较,不过得出的结论一般都是 PHP isset() 判断这个参数是否存在,且不为NULL,即使用 PHP isset() 判断空值、0、布尔值(TRUE/FALSE)都是TRUE,而且 PHP isset() 还可以对数组进行判断。

而 PHP empty(),若变量不存在,或者变量存在且其值为""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 TURE。

那么!empty(),就是变量存在,且值不为""、0、"0"、NULL、FALSE、array()以及var $var;

<?php
// $_POST['from'] 传递来的是一个网址,据此我们可以知道,这个值一定不为0和布尔,只能是字符串,或者空字符串,或者不存在 /* 下面写法比较常见,但是需要判断两次
if (isset($_POST['from']) && isset($_POST['from']{1}))
{
echo '$weigeti子符长度大于0';
}
*/ // 下面用!empty() 只需要判断一次,更加高效
if (!empty($_POST['from']))
{
echo '传递的from存在且不为空、0等';
}

虽然有时候用!empty()判断传递来的$_GET、$_POST 性能更优越,但是并不是能完全代替isset()使用,如果传递的值允许包含0、'0'或者空的时候,就不能使用!empty()判断了,否则即使传递过来了0、'0'都会被当作没有传递任何值过来。

而对于可以确定传递过来的值一定不为0、'0'、空的时候,如用户名、密码等,使用!empty() 性能更优越。

PHP判断变量是否存在及函数isset() 、empty()与is_null的区别的更多相关文章

  1. php中函数 isset&lpar;&rpar;&comma; empty&lpar;&rpar;&comma; is&lowbar;null&lpar;&rpar; 的区别,boolean类型和string类型的false判断

    php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断 实际需求:把sphinx返回的结果放到ssdb缓存里,要考虑到sph ...

  2. php中函数 isset&lpar;&rpar;&comma; empty&lpar;&rpar;&comma; is&lowbar;null&lpar;&rpar; 的区别

    NULL:当你在你的脚本中写下这样一行代码 $myvariable; //此处你想定义一个变量,但未赋值.会有Notice: Undefined variable echo $myvariable + ...

  3. 常用验证函数isset&lpar;&rpar;&sol;empty&lpar;&rpar;&sol;is&lowbar;numeric&lpar;&rpar;函数

    1) isset()用来检查变量是否设置,若变量存在且值不为NULL时为TRUE: 检查多个变量时变量要全部存在且值不为NULL时为TRUE: 若用函数unset()释放后再用isset()检测时为F ...

  4. velocity 判断 变量 是否不是空或empty

    原先的 #if($mobile) 这种写法是不准确的 ,请换成 "$!{ mobile}"!="" 说明 :    #if($mobile)   这种写法 只能 ...

  5. 2018&sol;03&sol;18 isset、empty、is&lowbar;null的区别

    在平常的工作中,判断一个值是否为空的情况时,会直接使用 if ($var) 这种形式,有时也会使用这三个函数进行比较,但是当时也没有很深入的学习. -- 还是通过实例来判断这几个的用法和场景 首先定义 ...

  6. isset&lpar;&rpar;、empty&lpar;&rpar;、is&lowbar;NULL&lpar;&rpar;的区别

    1,isset():变量不存在,或变量为null,返回false,否则返回true: 2,empty():变量不存在,或变量为null,返回true,另外"".0."0& ...

  7. php 判断变量函数

    1.isset功能:判断变量是否被初始化 判断变量是否被定义了 2.empty功能:检测变量是否为"空" 说明:任何一个未初始化的变量.值为 0 或 false 或 空字符串&qu ...

  8. 判断变量是否不为空,函数isset&lpar;&rpar;、&excl;empty&lpar;&rpar;与&excl;is&lowbar;null&lpar;&rpar;的比较

    转载:https://blog.csdn.net/qq_38812954/article/details/79581785 判断变量的值,尤其是判断他们是否不为空,我们有以下4种方法: if(isse ...

  9. php isset&lpar;&rpar; empty&lpar;&rpar; 区别, 判断 变量存在与否神器

    先看PHP手册: bool empty ( mixed $var ) 判断一个变量是否被认为是空的.当一个变量并不存在,或者它的值等同于FALSE,那么它会被认为不存在.如果变量不存在的话,empty ...

随机推荐

  1. mysql在空闲8小时之后会断开连接(默认情况)

    调试程序的过程发现,在mysql连接空闲一定时间(默认8小时)之后会断开连接,需要重新连接,也引发我对重连机制的思考.

  2. Oracle数据库之三

    子查询 -- 就是在一个查询中包含多个select语句(一般就2个) select id,first_name,dept_id from s_emp; 想查询和Ben一个部门的员工的id,first_ ...

  3. Entity Framework4&period;0 &lpar;七&rpar; EF4的存储过程

    前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的.呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句. 使用存储过程的好处: 提高效率:因为存储过程是经 ...

  4. c&num;正则表达式采集数据

    protected void Page_Load(object sender, EventArgs e){ StringBuilder MyStringBuilder = new StringBuil ...

  5. 【Xamarin挖墙脚系列:Xamarin&period;IOS的多个Storybord分隔视图的导航】

    在实际开发中,我是推荐使用画板Storybord的.也可以适当的添加xib进行界面的绘制.尽量不要用或者少用代码绘制视图.(少一些装B分子,可以极大的缩短项目的周期). 不要讲性能,不是不讲性能,ap ...

  6. Leetcode题解(29)

    93. Restore IP Addresses 题目 分析:多重循环,判断小数点合适的位置 代码如下(copy网上) class Solution { public: vector<strin ...

  7. 【JAVA零基础入门系列】Day7 Java输入与输出

    [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...

  8. delete与delete&lbrack;&rsqb;的区别

    一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...

  9. linux tracepoint用法【转】

    转自:https://blog.csdn.net/u014089131/article/details/73907995 在kernel中经常会看到trace_XX形式的函数,但是又找不到它的定义. ...

  10. echarts堆叠图添加总量

    echarts在使用中往往会遇到需要展示总量信息的情况,比较典型的就是3维统计的堆叠柱状图 堆叠是在柱状图的基础上,给几项设置同一stack来实现的.不考虑在tips中实现总和,有两种方式可以实现总和 ...