解析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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
用php+javascript实现二级级联菜单的制作
May 06 PHP
php adodb操作mysql数据库
Mar 19 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
Nov 07 PHP
基于Zookeeper的使用详解
May 02 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
php中header设置常见文件类型的content-type
Jun 23 PHP
php实现可运算的验证码
Nov 10 PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 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
一个ftp类(ini.php)
2006/10/09 PHP
php 分页原理详解
2009/08/21 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
浅谈Vue数据响应
2018/11/05 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
Python易忽视知识点小结
2015/05/25 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python中元组的用法整理
2020/06/15 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
网络研修随笔感言
2014/02/17 职场文书
房产继承公证书
2014/04/09 职场文书
财务管理专业求职信
2014/06/11 职场文书
干部个人对照检查材料
2014/08/25 职场文书
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python