详解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中使用sockets:从新闻组中获取文章
Oct 09 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
PHP读取xml方法介绍
Jan 12 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 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
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
Js的MessageBox
2006/12/03 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
js自定义瀑布流布局插件
2017/05/16 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
python求质数列表的例子
2019/11/24 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
学生的自我鉴定范文
2013/10/24 职场文书
车间班长岗位职责
2013/11/30 职场文书
高级工程师岗位职责
2013/12/15 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
导游词之湖北武当山
2019/09/23 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
一文搞懂Python Sklearn库使用
2021/08/23 Python
nginx.conf配置文件结构小结
2022/04/08 Servers