PHP empty() isset() is_null() 区别与性能比较

 更新时间:2016年11月25日 17:07  点击:1923
在php中empty() isset() is_null()三个函数都是判断是否为空的情况,但是如果我个要具体的深入去了解这个三个函数发现还是有许多的区别,下面我来给大家总结了一下。

is_null(), empty(), isset(),这几个函数以及 == ” , == array() 会在实际操作中经常用到。因为功能很类似,可能会忽视了他们的区别,一不小心就会给工作带来很大的麻烦。下面将这几种结构列出来,供自己和大家参考,鉴于表述的准确性,部分解释来自英文原版手册,避免中文手册的更新不及时以及翻译不当等问题。

is_null()
is_null(),bool,当参数满足 null 的三种情况时, is_null() 将返回 TRUE。

null类型,以下情况将被认定为 NULL:

it has been assigned the constant NULL.

it has not been set to any value yet.

it has been unset().

source:http://cn2.php.net/manual/en/language.types.null.php

isset()
isset(),bool,用于判定参数是否被设定并且不是 NULL。参数只能是变量。

如果没有设置变量,或者变量被 unset() 掉,或者变量值为 NULL ,返回 FALSE,其它情况返回 TRUE。即如果不是 NULL 就属于 isset 的范畴了,这一点和 is_null() 函数正好相反。

如果传递多个参数,将取交集。即所有参数全部符合 isset() 时才返回 TRUE。

ps:defined(),bool,用于检查常量是否被设置。

source:http://cn2.php.net/manual/en/function.isset.php

empty()
empty(),bool, 主要用于判断变量是否为空。参数只能是变量。

如下情况将被判定位空:

 代码如下 复制代码

“” (an empty string)

0 (0 as an integer)

0.0 (0 as a float)

“0″ (0 as a string)

NULL

FALSE

array() (an empty array)

var $var; (a variable declared, but without a value in a class)

注:如果参数是未设置的变量,变量将被认定为 NULL,不会报错,返回 TRUE。

但是注意在 5.0.0 之后,Objects with no properties are no longer considered empty.

source:http://cn2.php.net/manual/en/function.empty.php

判定是否为空的方式还有 == ”,== array() 等,比较有局限性,都没什么好说的。

测试的类型如下:

 

 代码如下 复制代码

<?php
$a;
$b = false;
$c = '';
$d = 0;
$e = null;
$f = array();

?>

empty()

首先是empty的var_dump输出:


:
<?php
var_dump(empty($a));
var_dump(empty($b));
var_dump(empty($c));
var_dump(empty($d));
var_dump(empty($e));
var_dump(empty($f));
?>

程序输出为:
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)

从代码中可以看出,只要数据类型是否为空或假,empty()就输出true。
isset()

再看看isset的输出:
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));
var_dump(isset($d));
var_dump(isset($e));
var_dump(isset($f));

// 输出
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)

可以看出isset()只能用来判断是否为NULL和未定义。
is_null()

最后是is_null的输出:
var_dump(is_null($a));
var_dump(is_null($b));
var_dump(is_null($c));
var_dump(is_null($d));
var_dump(is_null($e));
var_dump(is_null($f));

// 输出
bool(true)
bool(false)
bool(false)
bool(false)
bool(true)
bool(false)

is_null 字面意思了。

由此可见 empty() 可以用来判定所有的数据类型是否为空或假,而 is_null 与 isset 基本一样,只能用来判断是否为NULL和未定义。

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

刚才介绍的:检查变量,以及参数类型,这个是这3个函数不同之处的基础,也是最容易被忽视的。看到网上有很多对这个3个函数进行比较文章。很少涉及这些。下面我要说的,是在都检查已存在变量情况下,不同之处。

 代码如下 复制代码

<?php

$a=100;

$b="";

$c=null;

//isset检查

echo "isset","$a=$a",isset($a)?"define":"undefine","rn";

echo "isset","$b=$b",isset($b)?"define":"undefine","rn";

echo "isset","$c=$c",isset($c)?"define":"undefine","rn";

unset($b);

echo "isset","$b",isset($b)?"define":"undefine","rn";

$b=0;

echo "rnrn";

 

//empty检查

echo "empty","$a=$a",!empty($a)?"no empty":"empty","rn";

echo "empty","$b=$b",!empty($b)?"no empty":"empty","rn";

echo "empty","$c=$c",!empty($c)?"no empty":"empty","rn";

unset($b);

echo "empty","$b",!empty($b)?"no empty":"empty","rn";

$b=0;

echo "rnrn";

 

//is_null检查

echo "is_null","$a=$a",!is_null($a)?"no null":"null","rn";

echo "is_null","$b=$b",!is_null($b)?"no null":"null","rn";

echo "is_null","$c=$c",!is_null($c)?"no null":"null","rn";

unset($b);

echo "is_null","$b",is_null($b)?"no null":"null","rn";

下面是我收藏的一些PHP判断字符串是纯英文、纯汉字或汉英混合 实例,大家可参考。

纯英文

 代码如下 复制代码

if(preg_match("/^[a-z]*$/i",   "fdsFDfd")) 

 echo   "全字母 

 "; 

 } 

纯汉字

 代码如下 复制代码

比如:
var str = "php编程";
if (/^[u4e00-u9fa5]+$/.test(str)) {
alert("该字符串全部是中文");
}
else{
alert("该字符串不全部是中文");
} php中,是用x表示十六进制数据的。于是,变换成如下的代码:
$str = "php编程";
if (preg_match("/^[x4e00-x9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}


汉英混合
 
用户名:包括英文小写、汉字、数字、下划线,不能全部是数字,下划线不能在末尾

 代码如下 复制代码

/^[a-z0-9_u4e00-u9fa5]+[^_]$/g utf-8下

preg_match("/^[a-z0-9_x80-xff]+[^_]$/g",$a);gbk下:

preg_match("/^[a-z0-9_".chr(0xa1)."-".chr(0xff)."]+[^_]$/",$a)


utf-8编码

 代码如下 复制代码


<?php
/**
 * PHP判断字符串纯汉字 OR 纯英文 OR 汉英混合
 * 琼台博客
 */
echo '<meta charset="utf-8" />';
function utf8_str($str){
    $mb = mb_strlen($str,'utf-8');
    $st = strlen($str);
    if($st==$mb)
        return '纯英文';
    if($st%$mb==0 && $st%3==0)
        return '纯汉字';
    return '汉英混合';
}
 
$str = '琼台博客';
echo '字符串:<span style="color:red">'.$str.'</span>,是<span style="color:red">'.utf8_str($str).'</span>';
?>

gbk编码

 代码如下 复制代码

function gbk_str($str){
    $mb = mb_strlen($str,'gbk');
    $st = strlen($str);
    if($st==$mb)
        return '纯英文';
    if($st%$mb==0 && $st%2==0)
        return '纯汉字';
    return '汉英混合';
}

数字中文汉字

 代码如下 复制代码

$username=$_REQUEST['username'];
if(!preg_match("/^[a-z0-9xa1-xff]{3,10}$/",$username))
 {
  echo"34r345";
  exit;
 }

昨天开发一个产品要求由网站总后台生成一个注册码/序列号,然后我们以573-225-374-118这种格式生成,并且不重复在数据库是唯一的,下面我把我找到的与自己写的都记录一下。

原理,就是生成mt_rand随机种子来生成,然后利用相关函数进行读取操作

例1

 代码如下 复制代码

/**
 * 序列号生成器
 */
function snMaker($pre = '') {
 $date = date('Ymd');
 $rand = rand(1000000,9999999);
 $time = mb_substr(time(), 5, 5, 'utf-8');
 $serialNumber = $pre.$date.$time.$rand;
// echo strlen($serialNumber).'<br />';
 return $serialNumber;
}
echo snMaker();

/**
 * 将一个字符串的一部分替换成某一特定字符
 * @param str or int $str 需要处理的字符串
 * @param str or int $to 将替换成什么字符串
 * @param int $start 保留前几个字符
 * @param int $end 保留后几个字符
 */
function hideString($str = 'hello', $to = '*', $start = 1, $end = 0) {
 $lenth = strlen($str) - $start - $end;
 $lenth = ($lenth < 0) ? 0 : $lenth;
 $to = str_repeat($to, $lenth);
 $str = substr_replace($str, $to, $start, $lenth);
 return $str;
}

echo hideString();


例2 生成注册码/序列号

以下为引用的内容:

 代码如下 复制代码

<?php

 /* 配置 */
 $key_sum = 1500;    //CD-Key最大数量,防止重复值
 $key_total = 1000;    //最终需要的CD-Key数量
 $limiter = "-";    //CD-Key每组数字之间的连接符
 $save_file = "./cd_key.txt"; //保存CD-Key文件
 $num_file = "./number.txt"; //序列数字文件
 $file = file($num_file);  //打开序列数文件
 $start_num = 0;    //最小随机数
 $end_num = count($file);  //最大随机数

 /* 生成随机数字串 */
 $cdkey = array();
 for ($i=0; $i<$key_sum; $i++)
 {
     $key_str = $file[rand_num($start_num, $end_num)].$limiter.
                         $file[rand_num($start_num, $end_num)].$limiter.
                         $file[rand_num($start_num, $end_num)].$limiter.
                         $file[rand_num($start_num, $end_num)];
      $cdkey[] = str_replace("rn", "", $key_str);
 }

 /* 过滤重复串并且提取最终需要的CD-Key数量 */
 $cdkey = array_unique($cdkey);
 $key_result = array();
 for ($i=0; $i<$key_total; $i++)
 {
     $key_result[] = $cdkey[$i];
 }

 /* 把最终的CD-Key写入文件 */
 $fp = fopen($save_file, "w+") or die("Open $save_file failed");
 fwrite($fp, implode("rn", $key_result)) or die("Write $save_file failed");
 unset($cdkey);
 unset($$key_result);
 fclose($fp);

 echo "Create $key_total key succeed!";

 /* 随机函数 */
 function rand_num($start, $end)
 {
     return mt_rand($start, $end);
 }

?>

 


执行上面的程序就会生成cd_key.txt文件,里面包含了类似下面的验证码:


以下为引用的内容:

573-225-374-118
691-553-280-280
969-594-607-211
251-575-776-563
280-289-739-533...


这样,就完整的达到了我们的目的,你也可以把以上随机串保存到数据库里,方便调用。灵活设置以上变量,你能够生成16位、20位的验证码。如果你有兴趣,也可以写类似 XDF8F-ADE89-D0J5C-4RTFG之类的验证码

在php中拆分字符串我们会用到explode或者split函数,如果我们要组合字符串就可以使用implode或使用.号直接连接了

字符组合

 代码如下 复制代码

for($k=2;$k<5;$k++)
{
 if(!empty(${'pfile'.$k}))
 { echo ${'pfile'.$k};}//那么相当于输出的是$pfile2,$pfile3.......}
}

implode() 函数把数组元素组合为一个字符串。

注释:implode() 可以接收两种参数顺序。但是由于历史原因,explode() 是不行的。你必须保证 separator 参数在 string 参数之前才行。

例子

 代码如下 复制代码
<?php
$arr = array('Hello','World!','Beautiful','Day!');
echo implode(" ",$arr);
?>

输出:

Hello World! Beautiful Day!

explode() 函数把字符串分割为数组。


注释:参数 limit 是在 PHP 4.0.1 中加入的。

注释:由于历史原因,虽然 implode() 可以接收两种参数顺序,但是 explode() 不行。你必须保证 separator参数在 string 参数之前才行。

例子在本例中,我们将把字符串分割为数组:

 代码如下 复制代码

<?php
$str = "Hello world. It's a beautiful day.";
print_r (explode(" ",$str));
?>

输出:

Array
(
[0] => Hello
[1] => world.
[2] => It's
[3] => a
[4] => beautiful
[5] => day.
)

一个不错的php分割合并两个字符串的函数

 代码如下 复制代码

/**
 * Merges two strings in a way that a pattern like ABABAB will be
 * the result.
 *
 * @param     string    $str1   String A
 * @param     string    $str2   String B
 * @return    string    Merged string
 */ 
function MergeBetween($str1, $str2){
 
    // Split both strings
    $str1 = str_split($str1, 1);
    $str2 = str_split($str2, 1);
 
    // Swap variables if string 1 is larger than string 2
    if (count($str1) >= count($str2))
        list($str1, $str2) = array($str2, $str1);
 
    // Append the shorter string to the longer string
    for($x=0; $x < count($str1); $x++)
        $str2[$x] .= $str1[$x];
 
    return implode('', $str2);
}


//范例演示:
print MergeBetween('abcdef', '__') . "n";
print MergeBetween('__', 'abcdef') . "n";
print MergeBetween('bb', 'aa') . "n";
print MergeBetween('aa', 'bb') . "n";
print MergeBetween('a', 'b') . "n";
 
/*
Output:
 
a_b_cdef
a_b_cdef
baba
abab
ab
*/

今天我们来看在php中计算两个时间之间的时间差,下面我们直接使用了data,strtotime与time三个函数就实现了,有需要的朋友可参考。

今天要讲的这个例子,需求是这样的。得知某个日期时间,

如:2012-04-25 10:10:00

我要在这个日期时间的基础上加上5个月并返回处理后的日期

结果:2012-04-25 10:10:00 加5个月等于 2012-09-25 10:10:00


结合PHP函数date()与strtotime()两个函数来实现大致也是这个意思,

 代码如下 复制代码

<?php
/**
 * PHP里的日期加减方法
 * 琼台老屋
 */
// 第一步,假设有一个时间
$a = '2012-04-25 10:10:00';
 
// 第二步,获得这个日期的时间戳
$a_time = strtotime($a);
 
// 第三步,获得加五个月后的时间戳
$b_time = strtotime('+5 Month',$a_time);
 
// 第四部,把时间戳转换回日期格式
$b = date('Y-m-d H:i:s',$b_time);
echo '这是加了五个月后的日期'.$b;
 
// 如果你觉得以上代码过长也可以一行搞定
$b = date('Y-m-d H:i:s',strtotime('+'.$time.' Month',strtotime($a)));
echo '这是加了五个月后的日期'.$b;
?>

常用的计算时间

 代码如下 复制代码

<?php 
date_default_timezone_set('PRC'); //默认时区 
echo "今天:",date("Y-m-d",time()),"<br>"; 
echo "今天:",date("Y-m-d",strtotime("18 june 2008")),"<br>"; 
echo "昨天:",date("Y-m-d",strtotime("-1 day")), "<br>"; 
echo "明天:",date("Y-m-d",strtotime("+1 day")), "<br>"; 
echo "一周后:",date("Y-m-d",strtotime("+1 week")), "<br>"; 
echo "一周零两天四小时两秒后:",date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")), "<br>"; 
echo "下个星期四:",date("Y-m-d",strtotime("next Thursday")), "<br>"; 
echo "上个周一:".date("Y-m-d",strtotime("last Monday"))."<br>"; 
echo "一个月前:".date("Y-m-d",strtotime("last month"))."<br>"; 
echo "一个月后:".date("Y-m-d",strtotime("+1 month"))."<br>"; 
echo "十年后:".date("Y-m-d",strtotime("+10 year"))."<br>"; 
?>

输出结果

今天:2013-06-07
今天:2008-06-18
昨天:2013-06-06
明天:2013-06-08
一周后:2013-06-14
一周零两天四小时两秒后:2013-06-16 18:18:29
下个星期四:2013-06-13
上个周一:2013-06-03
一个月前:2013-05-07
一个月后:2013-07-07
十年后:2023-06-07

这些再看一些日期加减函数

 代码如下 复制代码

//获取当天的星期(1-7)
function GetWeek($times)
{
$res = date('w', strtotime($times));
if($res==0)
$res=7;
return $res;
}
//获取当天时间
function GetTime($times)
{
$res = date('H:i', strtotime($times));
return $res;
}
//获取现在过几月的的时间
function GetMonth($Month,$type='l')
{
if(!strcmp($type,'b'))
$res=date("Y-m-d H:i:s",strtotime("-$Month months"));
if(!strcmp($type,'l'))
$res=date("Y-m-d H:i:s",strtotime("+$Month months"));
return $res;
}
//获取当前时间
function GetCurrentDateTime()
{
$res=date("Y-m-d H:i:s",time());
return $res;
}
//获取当前时间隔几小时之前或之后的时间
function GetDiffHours($hours,$type='l')
{
if(!strcmp($type,'b'))
$res=date("Y-m-d H:i:s",strtotime("-$hours hour"));
if(!strcmp($type,'l'))
$res=date("Y-m-d H:i:s",strtotime("+$hours hour"));
return $res;
}
//间隔几分钟之前或之后的时间
function GetDiffMinute($Minute,$type='l')
{
if(!strcmp($type,'b'))
$res=date("Y-m-d H:i:s",strtotime("-$Minute minute"));
if(!strcmp($type,'l'))
$res=date("Y-m-d H:i:s",strtotime("+$Minute minute"));
return $res;
}
//间隔几秒之前或之后的时间
function GetDiffSec($sec,$type='l')
{
if(!strcmp($type,'b'))
$res=date("Y-m-d H:i:s",strtotime("-$sec second"));
if(!strcmp($type,'l'))
$res=date("Y-m-d H:i:s",strtotime("+$sec second"));
return $res;
}

//间隔几个星期之前或之后的时间
function GetDiffWeek($Week,$type='l')
{
if(!strcmp($type,'b'))
$res=date("Y-m-d H:i:s",strtotime("-$Week week"));
if(!strcmp($type,'l'))
$res=date("Y-m-d H:i:s",strtotime("+$Week week"));
return $res;
}
// 间隔几天之间的时间
function GetDiffDays($days,$type='l')
{
if(!strcmp($type,'b'))
$res=date("Y-m-d H:i:s",strtotime("-$days day"));
if(!strcmp($type,'l'))
$res=date("Y-m-d H:i:s",strtotime("+$days day"));
return $res;
}
//间隔几年之前或之后的时间
function GetDiffYears($year,$type='l')
{
if(!strcmp($type,'b'))
$res=date("Y-m-d H:i:s",strtotime("-$year year"));
if(!strcmp($type,'l'))
$res=date("Y-m-d H:i:s",strtotime("+$year year"));
return $res;
}

[!--infotagslink--]

相关文章

  • python中numpy.empty()函数实例讲解

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • lua读取redis数据的null判断示例代码

    最近在工作中遇到了一个问题,通过查找相关资料才得知原因是因为返回结果的问题,下面这篇文章主要给大家介绍了关于lua读取redis数据的null判断的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2020-06-30
  • php empty()函数详细

    今天要讲到了是关于empty函数的用法,和等空有什么区别,以及用它来操作数组时是不是返回正常的值,有需要的朋友可以参考一下。 代码如下 复制代码 ...2016-11-25
  • php isset和is_null区别

    isset和is_null的功能几乎完全相反的一样.. 是不是isset就是一个is_null的相反的别名? 诶, 要说区别, 那还真的是很多~ 一切的不同都是因为: is_null是函数, isset是...2016-11-25
  • php Note: empty() only checks variables as anything错误

    今天在利用empty()函数判断一个变量是否为null是发现提示Note: empty() only checks variables as anything else will result in a parse error. In other words, th...2016-11-25
  • php中isset()函数变量判断实例

    isset函数我们多用于判断变量是不是存在了,如isset($a)了,如果存在返回 true,否则返回false了,下面我们一起来看看。 isset函数是检测变量是否设置。 格式:bool isset...2016-11-25
  • PHP empty() isset() is_null() 区别与性能比较

    在php中empty() isset() is_null()三个函数都是判断是否为空的情况,但是如果我个要具体的深入去了解这个三个函数发现还是有许多的区别,下面我来给大家总结了一下。...2016-11-25
  • php empty()出错,Fatal error: Can’t use function return

    今天在利用empty函数是出现Fatal error: Can’t use function return value in write context错误提示,觉得很怪, 这个函数我可是使用了N久了今天怎么回事,下面大家来看...2016-11-25
  • php中empty(), is_null(), isset()函数区别

    在php中empty(), is_null(), isset()三个函数都可以用来判断变量是否存在的,那么empty(), is_null(), isset()之间的区别在哪里呢,如果你不明白我一起来看看下文。...2016-11-25
  • empty,isset,is_null比较(1/4)

    empty,isset,is_null 这几个函数时候,遇到一些问题。甚至给自己的程序带来一些安全隐患的bug。很多时候,对于isset,empty都认为差不多。因此开发时候,就没有注意,一段作为...2016-11-25
  • empty 和 is_null有什么区别?

    empty 和 is_null有什么区别? bool empty ( mixed $var ) 如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var...2016-11-25
  • php array_key_exists() 与 isset() 的区别

    这篇文章主要介绍了php array_key_exists() 与 isset() 的区别的相关资料,需要的朋友可以参考下...2016-11-01
  • php中isset(Null)与is_null() empty()用法比较

    在很多的程序员眼中php中的isset(Null)与is_null() empty()三个函数用法不太清楚了,下面小编就为各位介绍一下吧,希望可以给大家带来帮助。 但有时候会发现在php中...2016-11-25
  • php empty(), isset(), is_null()函数用法实例

    在php中empty(), isset(), is_null()三个函数在很多朋友看来都差不多,但我们简单想一下好像又不同,一个空值,一个是否是一个变量,是否为null,下面我来举例来说明。 很...2016-11-25
  • PHP isset()与empty()的使用区别详解

    本文主要介绍了PHP isset()与empty()的使用区别。具有很好的参考价值,下面跟着小编一起来看下吧...2017-02-18
  • PHP isset()函数与empty()函数区别

    empty 判断一个变量是否为“空”,isset 判断一个变量是否已经设置。正是这种所谓的“顾名思义”,令我开始时走了些弯路:当一个变量值等于0时,empty()也会成立(True) emp...2016-11-25
  • php使用empty()函数要注意事项

    使用empty()判断数字0的时候,empty()也会返回true,就是说如果你的变量有可能出现数字0这个变量,要使用isset()来判断会好一些!! 从表面上看,很容易误解empty()函数是判...2016-11-25