详解PHP中的null合并运算符


Posted in PHP onDecember 30, 2015

null合并运算符是一个好东西,有了它我们就能很方便的获取一个参数,并能在其为空的情况下提供一个默认值。比如在js中可以用||来搞:

function setSomething(a){
  a = a || 'some-default-value';
  // ...
}

而在PHP中,可惜PHP的||总是返回true或false,无法这样来搞。

 PHP7才正式加入了??这个运算符:

// 获取user参数的值(如果为空,则用'nobody')
$username = $_GET['user'] ?? 'nobody';
// 等价于:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

 PHP7 估计还有很长时间才能用到生产环境中,那在目前的PHP5中有没有替代方案呢?

 据研究,完全有个非常便捷的替代方案:

// 获取user参数的值(如果为空,则用'nobody')
$username = @$_GET['user'] ?: 'nobody';
// 等价于:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

 -- 运行此代码: https://3v4l.org/aDUW8

瞪大了眼睛看,跟前面的PHP7的例子差不多,主要是把 ?? 替换为了 ?: 。 这个是个什么鬼呢?其实这就是 (expr1) ? (expr2) : (expr3) 表达式的省略模式:

 表达式 (expr1) ? (expr2) : (expr3) 在 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。

 自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。

 -- http://php.net/manual/zh/language.operators.comparison.php

当然,这个替代方案也不是完美的 —— 如果 $_GET 中没有 'user',会有一条 Notice: Undefined index: user 的错误,所以需要用@来抑制这个错误,或者关闭 E_NOTICE 的错误。

ps:PHP7 null合并运算符 告别isset()

以前的写法

$info = isset($_GET['email']) ? $_GET['email'] : ‘noemail';

现在直接这样写就可以了

$info = $_GET['email'] ?? noemail;

还可以这样连写使用

$info = $_GET['email'] ?? $_POST['email'] ?? ‘noemail';
PHP 相关文章推荐
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
May 13 PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 PHP
Yii框架form表单用法实例
Dec 04 PHP
php常量详细解析
Oct 27 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
Dec 25 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
php实现文章评论系统
Feb 18 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 #PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 #PHP
分享PHP守护进程类
Dec 30 #PHP
如何写php守护进程(Daemon)
Dec 30 #PHP
PHP汉字转换拼音的函数代码
Dec 30 #PHP
使用PHP如何实现高效安全的ftp服务器(二)
Dec 30 #PHP
php获取当前页面完整URL地址
Dec 30 #PHP
You might like
PHP学习资料汇总与网址
2007/03/16 PHP
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
javascript 闭包详解
2015/02/15 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
js a标签点击事件
2017/03/30 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
js里面的变量范围分享
2020/07/18 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
Python实现的简单算术游戏实例
2015/05/26 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
django列表筛选功能的实现代码
2020/03/27 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
高级方案规划工程师岗位职责
2013/11/29 职场文书
小区门卫工作职责
2013/12/14 职场文书
初中化学教学反思
2014/01/23 职场文书
高三政治教学反思
2014/02/06 职场文书
学校招生宣传广告词
2014/03/19 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
北京申奥口号
2014/06/19 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
小班下学期个人总结
2015/02/12 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android