解析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
PHP4实际应用经验篇(5)
Oct 09 PHP
php下实现伪 url 的超简单方法[转]
Sep 24 PHP
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
PHP is_subclass_of函数的一个BUG和解决方法
Jun 01 PHP
php include类文件超时问题处理
Feb 06 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 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+MySQL的聊天室设计
2006/10/09 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
为数据添加append,remove功能
2006/10/03 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
微信小程序时间戳转日期的详解
2019/04/30 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
Python变量和数据类型详解
2017/02/15 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
python unittest实现api自动化测试
2018/04/04 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
最新茶叶店创业计划书
2014/01/14 职场文书
2014新年寄语
2014/01/20 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
党员个人整改措施
2014/10/24 职场文书
小学国庆节活动总结
2015/03/23 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书