解析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 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
php adodb连接不同数据库
Mar 19 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
php获取json数据所有的节点路径
May 17 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 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守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
python中的闭包用法实例详解
2015/05/05 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
同程旅游英文网站:LY.com
2018/11/13 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
XML文档面试题
2015/08/05 面试题
中专生求职自荐信范文
2013/12/22 职场文书
房屋维修申请报告
2015/05/18 职场文书
初中思想品德教学反思
2016/02/24 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python