加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

PHP7新增的NULL合并运算符??和?:的区别

发布时间:2020-05-25 10:44:34 所属栏目:PHP 来源:互联网
导读:介绍《PHP7新增的NULL合并运算符??和?:的区别》开发教程,希望对您有用。

《PHP7新增的NULL合并运算符??和?:的区别》要点:
本文介绍了PHP7新增的NULL合并运算符??和?:的区别,希望对您有用。如果有疑问,可以联系我们。

在PHP7中,新增了两个很有意思的运算符??和 ?:

那??( NULL 合并运算符)和?:的区别是什么?

这两种运算符,略有差别:

(1)??是只要前面的变量定义过了(即isset()为真)或前面表达式为真,则返回前面的值。

(2)?:则是运算符前面的表达式或变量值需为真则取前面的值,为假则取后面的值。但前提是前面的变量需要先定义过了已存在。


我们用实例来学习:

echo $a ?? 3;   //$a未定义不会出错,而是返回3. 只要$a值有了就返回$a的值,哪怕是空值。
echo $_GET['a'] ?? 1;  //它相当于:$a = isset($_GET['a']) ? $_GET['a'] : 1;


echo $a ?? 3;相当于 echo isset($a)?$a:3;  因此,在语法上简化了不少。

而?:则略有不同,我们把 error_reporting 打开E_ALL:


ini_set ('error_reporting',E_ALL);
echo  $a ?: 3;   //$a未定义提示:Notice: Undefined variable: a,
//如果$a有设置,则$a为真时返回的是前面判断表达式的值,为假时返回3.


总结:??和?:不同点: 

$_GET['a'] ?? 3 不用判断isset($_GET['a']),只要前面变量存在或表达式为真,就返回前面的值。

而对于?: 如果前面表达式的变量没有定义,则会出错。它只取分析前面的表达式是否为真。


因此,推荐使用??。


使用场景实战:

我们经常会取URL中的page参数做为页码,获得这种数值类型的参数,需要做2个判断:

1、是否存在$_GET['page']参数,有则转化为数值,不存在则设为1

2、如果存在,但值不符合要求,比如被人修改为字母,则还是要改为1.

传统写法:

$page = !empty($_GET['page']) ? intval ($_GET['page']) :1;  #检查是否定义page并转为int
if(empty($page)) $page=1;  #防止出现字母等参数则page值转为int后为0
echo $page;


现在把上面3行代码用??和?:并成一行。

echo intval ($_GET['page'] ?? 1)?:1;

这样以后取分页参数就简单了吧。


扩展:

所有获取数值类参数都有上面同样的格式,因此,可以封装成函数

/**
 * 数值类型的GET参数获取,如分页码,或ID值
 * @author http://www.jb51.cc
 * @param string $page  参数名,默认是分页码 page
 * @param int $minValue  最小值
 * @return int
 */
function intGet($page='page' , $minValue=1)
{
       return intval ($_GET[$page] ?? $minValue)?:$minValue;
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读