详解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 05 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 PHP
PHP列出MySQL中所有数据库的方法
Mar 12 PHP
Symfony2 session用法实例分析
Feb 04 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
yii2学习教程之5种内置行为类详解
Aug 03 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
Laravel框架路由管理简单示例
May 07 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 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封装的连接Mysql类及用法分析
2015/12/10 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
JavaScript实现拼音排序的方法
2012/11/20 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
angularjs基础教程
2014/12/25 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
跟老齐学Python之list和str比较
2014/09/20 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
请介绍一下Ant
2016/07/22 面试题
酒店应聘自荐信
2013/11/09 职场文书
应届大学生自荐信
2013/12/05 职场文书
行政部总经理岗位职责
2014/01/04 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
学习之星事迹材料
2014/05/17 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
新学期家长寄语2016
2015/12/03 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
python中的random模块和相关函数详解
2022/04/22 Python
css3 选择器
2022/05/11 HTML / CSS