详解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 相关文章推荐
PhpMyAdmin中无法导入sql文件的解决办法
Jan 08 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
May 16 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
基于JQuery+PHP编写砸金蛋中奖程序
Sep 08 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 PHP
php获取当前url地址的方法小结
Jan 10 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
jquery.validate分组验证代码
2011/03/17 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
jstree的简单实例
2016/12/01 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
python中list列表的高级函数
2016/05/17 Python
Python贪心算法实例小结
2018/04/22 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
医学专业个人求职自荐信格式
2013/09/23 职场文书
测绘工程系学生的自我评价
2013/11/30 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
五年级科学教学反思
2014/02/05 职场文书
网络技术专业求职信
2014/07/13 职场文书
2014年教研工作总结
2014/12/06 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
校运会班级霸气口号
2015/12/24 职场文书
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers