解析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 相关文章推荐
smtp邮件发送一例
Oct 09 PHP
php MsSql server时遇到的中文编码问题
Jun 11 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
迁移PHP版本到PHP7
Feb 06 PHP
Zend Framework入门知识点小结
Mar 19 PHP
PHP读书笔记_运算符详解
Jul 01 PHP
PHP弱类型的安全问题详细总结
Sep 25 PHP
php实现用户登陆简单实例
Apr 04 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
详解PHP发送邮件知识点
May 06 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
php中加密解密DES类的简单使用方法示例
Mar 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
中东人咖啡哲学
2021/03/03 咖啡文化
PHP动态创建Web站点的方法
2011/08/14 PHP
php数据库备份还原类分享
2014/03/20 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
python找出完数的方法
2018/11/12 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
C# .NET面试题
2015/11/28 面试题
中间件分为哪几类
2016/09/18 面试题
无房证明样本
2015/06/17 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
Python快速实现一键抠图功能的全过程
2021/06/29 Python
浅谈如何保证Mysql主从一致
2022/03/13 MySQL