您好,登錄后才能下訂單哦!
今天小編就為大家?guī)?lái)一篇PHP7添加非空合并語(yǔ)法分析的文章。小編覺得挺實(shí)用的,為此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。
我們知道從 PHP 5.3 起三元運(yùn)算符有一個(gè)寫法簡(jiǎn)潔寫法是這樣的:
<?php $a = 0; $b = $a ?: 1; # $b === 1
這實(shí)際上相當(dāng)于:
<?php $a = 0; $b = $a ? $a : 1; # $b === 1
在 PHP5 中,語(yǔ)法分析是這樣寫的:
| 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(抽象語(yǔ)法樹)的引入,語(yǔ)法分析有些簡(jiǎn)化:
| expr '?' expr ':' expr { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, $3, $5); } | expr '?' ':' expr { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, NULL, $4); }
PHP7 中語(yǔ)法分析之后都是寫到 AST 的節(jié)點(diǎn)上。從上面可以看出,簡(jiǎn)化的 ?: 和完整的三元表達(dá)式的區(qū)別就是節(jié)點(diǎn)中間的值為 NULL。
PHP7 添加了一個(gè)合并操作符(T_COALESCE),用于簡(jiǎn)化 isset
的條件判斷:
<?php $b = $a ?? 1;
它相當(dāng)于:
<?php $b = isset($a) ? $a : 1;
僅僅是 isset
判斷,在 為等值時(shí)還是會(huì)返回b
的值還是為 0
。
這個(gè)操作符的語(yǔ)法分析語(yǔ)句是:
| expr T_COALESCE expr { $$ = zend_ast_create(ZEND_AST_COALESCE, $1, $3); }
如果想將 isset
換成 empty
的效果,也就是說(shuō)在變量不存在或轉(zhuǎn)換成 boolean
后為 false
都賦予其他值,需要這樣寫:
<?php $b = $a ?? 1 ?: 1;
顯然上面的表達(dá)式中中間一部分稍微有些多余,那么做些簡(jiǎn)化呢?
現(xiàn)在我想添加一個(gè)語(yǔ)法 ??:
,它的作用是對(duì)變量做 empty
的判斷。也就是說(shuō)達(dá)到上面 $a ?? 1 ?: 1
的效果:
<?php $b = $a ??: 1;
改起來(lái)很簡(jiǎn)單,只需要將 ?:
和 ??
的分析合并一下(注意這里和上面所有的地方 $1 $2
等符號(hào)的數(shù)字表示的都是變量或者常量出現(xiàn)的位置順序):
| expr T_COALESCE ':' expr { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, zend_ast_create(ZEND_AST_COALESCE, $1, $4), NULL, $4); }
僅僅只有兩句,因?yàn)椴]有在詞法分析器中添加 Token
,所以只能算是個(gè)語(yǔ)法糖。
重新編譯一下之后就能看到效果啦。
測(cè)試:
$ /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添加非空合并語(yǔ)法的分析內(nèi)容,詳細(xì)使用情況還得要大家自己使用過(guò)才能知道具體要領(lǐng)。如果想閱讀更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。