解析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
dedecms中常见问题修改方法总结
Mar 21 PHP
php str_pad 函数用法简介
Jul 11 PHP
php Smarty 字符比较代码
Feb 27 PHP
常用的PHP数据库操作方法(MYSQL版)
Jun 08 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 PHP
PHP常用函数之base64图片上传功能详解
Oct 21 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 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
基于mysql的bbs设计(二)
2006/10/09 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
js实现转动骰子模型
2019/10/24 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
python 正则式 概述及常用字符
2009/05/07 Python
Python素数检测的方法
2015/05/11 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
YUV转为jpg图像的实现
2019/12/09 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
党员学习十八大感想
2014/01/17 职场文书
汉语言文学职业规划
2014/02/14 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
学校师德师风整改措施
2014/10/27 职场文书
美术教师个人工作总结
2015/02/06 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js