详解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 相关文章推荐
人大复印资料处理程序_补充篇
Oct 09 PHP
mysql 字段类型说明
Apr 27 PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
PHP简单实现DES加密解密的方法
Jul 12 PHP
php 中奖概率算法实现代码
Jan 25 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
详解PHP如何更好的利用PHPstorm的自动提示
Aug 18 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 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下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
php检测文本的编码
2015/07/26 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
javascript动画浅析
2012/08/30 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
python批量修改文件名的实现代码
2014/09/01 Python
pandas值替换方法
2018/07/10 Python
python 获取url中的参数列表实例
2018/12/18 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
python实现各种插值法(数值分析)
2019/07/30 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
美国玩具公司:U.S.Toy
2018/05/19 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
幼儿园中秋节活动反思
2014/02/16 职场文书
电子商务专业求职信
2014/03/08 职场文书
村干部任职承诺书
2015/01/21 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
2022年显卡天梯图(6月更新)
2022/06/17 数码科技