解析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 相关文章推荐
我的论坛源代码(三)
Oct 09 PHP
PHP输出XML到页面的3种方法详解
Jun 06 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
PHP生成plist数据的方法
Jun 16 PHP
初识PHP中的Swoole
Apr 05 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
Sep 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
如何做到多笔资料的同步
2006/10/09 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
动态控制Table的js代码
2007/03/07 Javascript
Javascript 学习书 推荐
2009/06/13 Javascript
javascript中length属性的探索
2011/07/31 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
python返回昨天日期的方法
2015/05/13 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python list格式数据excel导出方法
2018/10/31 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
担保贷款承诺书
2015/04/30 职场文书
捐款仪式主持词
2015/07/04 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android