详解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连mysql和oracle数据库性能比较
Oct 09 PHP
基于xcache的配置与使用详解
Jun 18 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
php+mysqli事务控制实现银行转账实例
Jan 29 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 PHP
php将服务端的文件读出来显示在web页面实例
Oct 31 PHP
PHP分享图片的生成方法
Apr 25 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 25 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实现数组重复数字统计实例
2018/09/30 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
javascript 写类方式之八
2009/07/05 Javascript
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
python实现ip查询示例
2014/03/26 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Win8下python3.5.1安装教程
2020/07/29 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
Python异常处理知识点总结
2019/02/18 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
英语教育专业自荐信
2014/05/29 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
感恩教师节主题班会
2015/08/12 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏