解析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版)
Oct 09 PHP
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
PHP 编程安全性小结
Jan 08 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
Mar 23 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php随机获取金山词霸每日一句的方法
Jul 09 PHP
PHP中header用法小结
May 23 PHP
php简单截取字符串代码示例
Oct 19 PHP
php 函数使用可变数量的参数方法
May 02 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 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
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP 验证登陆类分享
2015/03/13 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
vue.js中created方法作用
2018/03/30 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
详解python和matlab的优势与区别
2019/06/28 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
python实现批量转换图片为黑白
2020/06/16 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
表演方阵解说词
2014/02/08 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
土建技术员岗位职责
2015/04/11 职场文书
教师节领导致辞
2015/07/29 职场文书
Hive导入csv文件示例
2022/06/25 数据库