详解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 相关文章推荐
Smarty模板快速入门
Jan 04 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 PHP
使用PHP静态变量当缓存的方法
Nov 13 PHP
PHP中常用的转义函数
Feb 28 PHP
destoon找回管理员密码的方法
Jun 21 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
使用PHP实现微信摇一摇周边红包
Jan 04 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP操作Redis常用技巧总结
Apr 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
根德YB400的电路分析
2021/03/02 无线电
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
js综合应用实例简单的表格统计
2013/09/03 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
python实现网页链接提取的方法分享
2014/02/25 Python
python中的set实现不重复的排序原理
2018/01/24 Python
python日志模块logbook使用方法
2019/09/19 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
"引用"与多态的关系
2013/02/01 面试题
自荐信封面
2013/12/04 职场文书
亲子拓展活动方案
2014/02/20 职场文书
质量承诺书范文
2014/03/27 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS
Python办公自动化PPT批量转换操作
2021/09/15 Python
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android