解析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 sprintf() 函数的应用(定义和用法)
Jun 29 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
详解PHP的Yii框架中自带的前端资源包的使用
Mar 31 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
Jun 13 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
Sep 11 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 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程序的php代码
2008/04/07 PHP
PHP写MySQL数据 实现代码
2009/06/15 PHP
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python opencv之SURF算法示例
2018/02/24 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
python画微信表情符的实例代码
2019/10/09 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
python能做哪些生活有趣的事情
2020/09/09 Python
Python中常用的os操作汇总
2020/11/05 Python
python 制作网站小说下载器
2021/02/20 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
德国足球商店:OUTFITTER
2019/05/06 全球购物
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
村捐赠仪式答谢词
2014/01/21 职场文书
大学社团活动总结
2014/04/26 职场文书
党员自我对照检查材料
2014/08/19 职场文书
领导班子整改方案
2014/10/25 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
幼儿学前班评语
2014/12/29 职场文书
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL