解析isset与is_null的区别


Posted in PHP onAugust 09, 2013

isset和is_null啥区别,
看手册上讲的话, isset和is_null的功能几乎完全”相反的一样”..
是不是isset就是一个is_null的相反的别名?
诶, 要说区别, 那还真的是很多~

一切的不同都是因为: is_null是函数, isset是语句.
isset是语句, 和echo, print一样, 是PHP本身的一种语言结构.
而is_null是函数, 和我们一般的函数一样, 可以做为可变函数调用.
你也许会说, 好了,好了,我知道函数和语句的区别, 但到底是TMD什么区别?
诶, 所谓语句,语言结构, 就是说, 是语言本身支持的语句, 标识符.
比如, for, foreach, continue 等等, 它们在语法分析的时刻就被”抹掉”(逻辑上替代了)了.
让我们看看isset这个语句在语法分析的过程中, 是如何被”抹掉”的.

1. 首先, 在词法分析的时候, isset会被识别为T_ISSET标识符.
2. 而在语法分析阶段, isset($var)这个指令, 会被分析成一条Opcode:ZEND_ISSET_ISEMPTY_VARS.

你可以理解isset就想C语言里面的宏, 在编译/执行之前已经被展开了.
因为这个, 所以在表现上, 会有如下的不同:
因为is_null是函数, 所以它可以通过如下方式调用:

<?php
$var = NULL;
$func = "is_null";
$func($var);
?>

而, isset因为是语句, 所以不能这样调用.
因为is_null是函数, 所以它可以接受函数返回值做为参数, 而isset不行(当然, 如果PHP想支持, 其实也是可以的, 只不过就要增加编译阶段的复杂度了):
<?php
is_null(intval("0x45"));
//OK
isset(intval("0x45"));
//PHP Fatal error: Can't use function return value in write context
is_null(NULL);
//OK
isset(NULL);
//PHP Parse error: syntax error
?>

说了这么多isset的缺点了, 说点它的优点吧:
因为isset是语句, 所以它快!
在一千万次的简单检测语句循环中, 对比结果如下:
<?php
$a="laruence":
isset($a); //用时: 1.15s
is_null($a); //用时: 3.89s
?>

因为isset叫做isset, 所以它在检测未定义变量的时候, 不会产生NOTICE:
<?php
isset($laruence);
//OK
is_null($laruence);
//PHP Notice: Undefined variable: laruence
?>

那么, 对于什么时候用isset什么时候用is_null, 我有什么建议呢?
诶, 我的建议是, 用函数做函数应该做的事情~, 听起来象废话?
isset => is set? => 变量有没有被赋值(声明)
is_null => is null? => 变量为NULL么?
另外, 如果要用is_null, 我建议使用 “=== NULL” 来代替, 它不仅语义和is_null一致, 结果一致, 速度还和isset差不多:
在一千万次的简单检测语句循环中, 对比结果如下:
<?php
$a="laruence":
isset($a); //用时: 1.15s
is_null($a); //用时: 3.88s
$a===NULL; //用时: 1.22s
?>

PHP 相关文章推荐
php getsiteurl()函数
Sep 05 PHP
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
解析PHP的session过期设置
Jun 29 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
Jan 12 PHP
php创建、获取cookie及基础要点分析
Jan 26 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
php图片添加文字水印实现代码
Mar 15 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
IIS 7.5 asp Session超时时间设置方法
Apr 17 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
php实现微信支付之现金红包
May 30 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 #PHP
php中用socket模拟http中post或者get提交数据的示例代码
Aug 08 #PHP
浅析php变量作用域的一些问题
Aug 08 #PHP
解析php开发中的中文编码问题
Aug 08 #PHP
php中jpgraph类库的使用介绍
Aug 08 #PHP
浅析php与数据库代码开发规范
Aug 08 #PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 #PHP
You might like
PHP中的日期及时间
2006/11/23 PHP
php 301转向实现代码
2008/09/18 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
JavaScript函数IIFE使用详解
2019/10/21 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
全面解析Python的While循环语句的使用方法
2015/10/13 Python
python实现批量修改文件名代码
2017/09/10 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
Python中的TCP socket写法示例
2018/05/11 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
django列表筛选功能的实现代码
2020/03/27 Python
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
电子商务专业求职信
2014/03/08 职场文书
创先争优活动心得体会
2014/09/04 职场文书
2014年减负工作总结
2014/12/10 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
php中pcntl_fork详解
2021/04/01 PHP