《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.snjht.com * @param string $page 參數名,默認是分頁碼 page * @param int $minValue 最小值 * @return int */ function intGet($page='page' , $minValue=1) { return intval ($_GET[$page] ?? $minValue)?:$minValue; }
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/141.html