详解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的异常处理类Exception的使用及说明
Jun 13 PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
PHP以指定字段为索引返回数据库所取的数据数组
Jun 30 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
php中使用websocket详解
Sep 23 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
PHP实现的AES 128位加密算法示例
Sep 16 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
Sep 30 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
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
深入浅析php json 格式控制
2015/12/24 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
模拟select的代码
2011/10/19 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python制作简易注册登录系统
2016/12/15 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
python 阶乘累加和的实例
2019/02/01 Python
python之mock模块基本使用方法详解
2019/06/27 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
Django 限制访问频率的思路详解
2019/12/24 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
大学毕业自我评价
2014/02/02 职场文书
优秀党员获奖感言
2014/02/18 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
食堂管理制度范本
2015/08/04 职场文书
五年级作文之想象作文
2019/10/30 职场文书
防止web项目中的SQL注入
2021/12/06 MySQL