详解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 相关文章推荐
Sorting Array Values in PHP(数组排序)
Sep 15 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
Oct 24 PHP
CI框架中zip类应用示例
Jun 17 PHP
php防止伪造的数据从URL提交方法
Jun 27 PHP
PHP基本语法总结
Sep 06 PHP
PHP会话处理的10个函数
Aug 11 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
PHP聊天室简单实现方法详解
Dec 08 PHP
PHP7移除的扩展和SAPI
Mar 09 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支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
python实现人民币大写转换
2018/06/20 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
关于Java String的一道面试题
2013/09/29 面试题
linux比较文件内容的命令是什么
2013/03/04 面试题
医学生自荐信
2013/12/03 职场文书
优秀家长事迹材料
2014/05/17 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
Spring Bean是如何初始化的详解
2022/03/22 Java/Android