《PHP7新增的NULL合并运算符??和?:的区别》要点:
本文介绍了PHP7新增的NULL合并运算符??和?:的区别,希望对您有用。如果有疑问,可以联系我们。
相关主题:PHP开发
在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.vephp.com * @param string $page 参数名,默认是分页码 page * @param int $minValue 最小值 * @return int */ function intGet($page='page' , $minValue=1) { return intval ($_GET[$page] ?? $minValue)?:$minValue; }
转载请注明本页网址:
http://www.vephp.com/jiaocheng/141.html