91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP7添加非空合并語法分析

發布時間:2020-05-13 14:52:35 來源:億速云 閱讀:169 作者:Leah 欄目:編程語言

今天小編就為大家帶來一篇PHP7添加非空合并語法分析的文章。小編覺得挺實用的,為此分享給大家做個參考。一起跟隨小編過來看看吧。

我們知道從 PHP 5.3 起三元運算符有一個寫法簡潔寫法是這樣的:

<?php
$a = 0;
$b = $a ?: 1; # $b === 1

這實際上相當于:

<?php
$a = 0;
$b = $a ? $a : 1; # $b === 1

在 PHP5 中,語法分析是這樣寫的:

|   expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); }
    expr ':' { zend_do_qm_true(&$4, &$2, &$5 TSRMLS_CC); }
    expr     { zend_do_qm_false(&$$, &$7, &$2, &$5 TSRMLS_CC); }
|   expr '?' ':' { zend_do_jmp_set(&$1, &$2, &$3 TSRMLS_CC); }
    expr     { zend_do_jmp_set_else(&$$, &$5, &$2, &$3 TSRMLS_CC); }

在 PHP7 中,由于 AST(抽象語法樹)的引入,語法分析有些簡化:

|   expr '?' expr ':' expr
        { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, $3, $5); }
|   expr '?' ':' expr
        { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, NULL, $4); }

PHP7 中語法分析之后都是寫到 AST 的節點上。從上面可以看出,簡化的 ?: 和完整的三元表達式的區別就是節點中間的值為 NULL。

PHP7 添加了一個合并操作符(T_COALESCE),用于簡化 isset 的條件判斷:

<?php
$b = $a ?? 1;

它相當于:

<?php
$b = isset($a) ? $a : 1;

僅僅是 isset 判斷,在 為等值時還是會返回b 的值還是為 0

這個操作符的語法分析語句是:

|   expr T_COALESCE expr
        { $$ = zend_ast_create(ZEND_AST_COALESCE, $1, $3); }

如果想將 isset 換成 empty 的效果,也就是說在變量不存在或轉換成 boolean 后為 false 都賦予其他值,需要這樣寫:

<?php
$b = $a ?? 1 ?: 1;

顯然上面的表達式中中間一部分稍微有些多余,那么做些簡化呢?

現在我想添加一個語法 ??: ,它的作用是對變量做 empty 的判斷。也就是說達到上面 $a ?? 1 ?: 1 的效果:

<?php
$b = $a ??: 1;

改起來很簡單,只需要將 ?: ?? 的分析合并一下(注意這里和上面所有的地方 $1 $2 等符號的數字表示的都是變量或者常量出現的位置順序):

|   expr T_COALESCE ':' expr
        { $$ = zend_ast_create(ZEND_AST_CONDITIONAL,
            zend_ast_create(ZEND_AST_COALESCE, $1, $4), NULL, $4); }

僅僅只有兩句,因為并沒有在詞法分析器中添加 Token,所以只能算是個語法糖。

重新編譯一下之后就能看到效果啦。

測試:

$ /usr/local/php/bin/php -r "\$a = 0; echo \$a ?? 1, PHP_EOL;"
0
$ /usr/local/php/bin/php -r "\$a = 0; echo \$a ??: 1, PHP_EOL;"
1

以上就是PHP7添加非空合并語法的分析內容,詳細使用情況還得要大家自己使用過才能知道具體要領。如果想閱讀更多相關內容的文章,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清丰县| 文成县| 巨野县| 城固县| 岫岩| 莱州市| 涿鹿县| 兴业县| 忻州市| 临武县| 湟源县| 陇西县| 霍城县| 乌鲁木齐县| 凤山县| 罗城| 建昌县| 繁昌县| 九江市| 当阳市| 海伦市| 清涧县| 老河口市| 巴彦县| 土默特右旗| 上栗县| 澄江县| 景德镇市| 宁城县| 渝北区| 金山区| 越西县| 五原县| 三明市| 鄯善县| 丽水市| 色达县| 平陆县| 西乌珠穆沁旗| 吴堡县| 沙河市|