详解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 获取mysql数据库信息代码
Mar 12 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
php二分查找二种实现示例
Mar 12 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
php中的登陆login实例代码
Jun 20 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
PHP XML Expat解析器知识点总结
Feb 15 PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 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版本号
2006/10/09 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
Python读写文件方法总结
2015/06/09 Python
pandas数值计算与排序方法
2018/04/12 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
Pytorch的mean和std调查实例
2020/01/02 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
好军嫂事迹材料
2014/01/15 职场文书
村干部培训方案
2014/05/02 职场文书
八项规定对照检查材料
2014/08/31 职场文书
法院个人总结
2015/03/03 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
Apache POI的基本使用详解
2021/11/07 Servers