project: blog
target: null-coalesce-operator-in-php.md
date: 2015-12-30
status: publish
tags:
- Null Coalesce
- PHP
categories:
- PHP

null合并运算符是一个好东西,有了它我们就能很方便的获取一个参数,并能在其为空的情况下提供一个默认值。比如在js中可以用||来搞:

function setSomething(a){
a = a || 'some-default-value';
// ...
}

而在PHP中,可惜PHP的||总是返回truefalse,无法这样来搞。
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 的错误。

最新文章

  1. python 端口扫描
  2. 解决eclipse之ADT与SDK版本不一致问题
  3. DirectoryHelper
  4. eclipse 导入web项目后,线程假死
  5. Nginx Installation、Configuration、Rreverse Proxy、Load Balancing Learning
  6. EASYUI Dialog的基本使用
  7. 【C语言】编写一个函数实现n^k,使用递归实现
  8. 使用非java代码编程
  9. sparse_softmax_cross_entropy_with_logits
  10. android - TextView单行显示...或者文字左右滚动(走马灯效果)
  11. 洛谷P1443 马的遍历
  12. ORACLE---OCP培训
  13. P1141 01迷宫 DFS (用并查集优化)
  14. java二叉树排序实现
  15. 洛谷P1615 西游记公司 题解
  16. Java之逆向工程(1) - 反编译、修补和逆向工程技术 读书笔记
  17. 决策树ID3算法python实现 -- 《机器学习实战》
  18. 如何让Ubuntu 14重启后,保存屏幕亮度的设置
  19. [巩固C#] 三、依赖注入是什么?
  20. ios之UIPopoverController

热门文章

  1. 原生JS--Ajax
  2. 使用Lombok简化你的代码
  3. js页面刷新之实现框架内外刷新(整体、局部)
  4. 覆盖的面积(HDU 1255 线段树)
  5. TortoiseSVN安装使用
  6. LA 3713 宇航员分组
  7. 使用IOS7原生API进行二维码条形码的扫描
  8. 安装DotNetCore.1.0.0-VS2015Tools.Preview2失败解决方案
  9. 8 个必备的PHP功能开发
  10. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页