详解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 相关文章推荐
php5中类的学习
Mar 28 PHP
php将数据库导出成excel的方法
May 07 PHP
PHP调用Linux的命令行执行文件压缩命令
Jan 27 PHP
php自定义的格式化时间示例代码
Dec 05 PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
crontab无法执行php的解决方法
Jan 25 PHP
php中引用符号(&)的使用详细介绍
Dec 06 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
Mar 25 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
Smarty模板配置实例简析
Jul 20 PHP
php自动加载代码实例详解
Feb 26 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.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
php的4种常见运行方式
2015/03/20 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
JS实现时间格式化的方式汇总
2013/10/16 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
Python中获取对象信息的方法
2015/04/27 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
django框架两个使用模板实例
2019/12/11 Python
python读取ini配置文件过程示范
2019/12/23 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
行政管理人员精品工作推荐信
2013/11/04 职场文书
应届大学生求职的自我评价
2013/11/17 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
学雷锋倡议书
2015/01/19 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
详解python网络进程
2021/06/15 Python