详解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 的 __FILE__ 常量
Jan 15 PHP
在PHP里得到前天和昨天的日期的代码
Aug 16 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 PHP
Laravel5.1 框架控制器基础用法实例分析
Jan 04 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 团购折扣计算公式
2011/11/24 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
微信小程序事件流原理解析
2019/11/27 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
python web框架学习笔记
2016/05/03 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
python实现复制文件到指定目录
2019/10/16 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
《老王》教学反思
2014/02/23 职场文书
房产委托公证书样本
2014/04/04 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
亲子活动总结
2014/04/26 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
个人借款协议书范本
2014/11/17 职场文书
离婚案件上诉状
2015/05/23 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers