详解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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
非常好的php目录导航文件代码
Oct 09 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
php另类上传图片的方法(PHP用Socket上传图片)
Oct 30 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
May 04 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
百度实时推送api接口应用示例
Oct 21 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
PHP错误机制知识汇总
Mar 24 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
PHP利用百度ai实现文本和图片审核
May 08 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
PHP实现文件安全下载
2006/10/09 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
利用python发送和接收邮件
2016/09/27 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
Python pymsql模块的使用
2020/09/07 Python
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
会议接待欢迎词
2014/01/12 职场文书
护士自我介绍信
2014/01/13 职场文书
英语自我评价范文
2014/01/24 职场文书
中学教师培训制度
2014/01/31 职场文书
化妆品促销方案
2014/02/24 职场文书
目标责任书范文
2014/04/14 职场文书
不忘国耻振兴中华演讲稿
2014/05/14 职场文书
员工安全责任书范本
2014/07/24 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
民事辩护词范文
2015/05/21 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
优秀新员工事迹材料
2019/05/13 职场文书