摘要:添加了一個(gè)合并操作符,用于簡化的條件判斷它相當(dāng)于僅僅是判斷,在為等值時(shí)還是會(huì)返回的值還是為。
我們知道從 PHP 5.3?起三元運(yùn)算符 ? : 有一個(gè)寫法簡潔寫法是這樣的:
這實(shí)際上相當(dāng)于:
在 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 的節(jié)點(diǎn)上。從上面可以看出,簡化的 ?: 和完整的三元表達(dá)式的區(qū)別就是節(jié)點(diǎn)中間的值為 NULL。
PHP7 添加了一個(gè)合并操作符(T_COALESCE),用于簡化 isset 的條件判斷:
它相當(dāng)于:
僅僅是 isset 判斷,在 $a 為 0 等值時(shí)還是會(huì)返回 $b 的值還是為 0 。
這個(gè)操作符的語法分析語句是:
| expr T_COALESCE expr { $$ = zend_ast_create(ZEND_AST_COALESCE, $1, $3); }如果想將 isset 換成 empty 的效果,也就是說在變量不存在或轉(zhuǎn)換成 boolean 后為 false 都賦予其他值,需要這樣寫:
顯然上面的表達(dá)式中中間一部分稍微有些多余,那么做些簡化呢?
現(xiàn)在我想添加一個(gè)語法 ??: ,它的作用是對變量做 empty 的判斷。也就是說達(dá)到上面 $a ?? 1 ?: 1 的效果:
改起來很簡單,只需要將 ?: 和 ?? 的分析合并一下(注意這里和上面所有的地方 $1 $2 等符號的數(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è)語法糖。
重新編譯一下之后就能看到效果啦。測試:
$ /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;" 1Enjoy IT!
私博地址:http://0x1.im
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/21208.html
摘要:雖然是一個(gè)比較操作符,確實(shí)一個(gè)賦值操作符號。從實(shí)際的工程經(jīng)驗(yàn)上來說,這個(gè)操作符確實(shí)能簡化判斷。這也不是第一個(gè)三個(gè)字符組成的操作符除此之外還有。 我在翻看 PHP 的 RFC 列表的時(shí)候發(fā)現(xiàn)了一篇不算新的,但很有意思的 rfc:空合并賦值操作符 (姑且就這么翻譯吧)。 它會(huì)引起我的注意的還有一個(gè)原因是我之前寫過這樣一篇文章:兩行代碼給 PHP7 添加一個(gè)非空合并語法糖,里面講的是添加一個(gè)...
摘要:本文介紹筆者自己寫的語法糖擴(kuò)展,擴(kuò)展了一種全新的超全局變量獲取方式。優(yōu)秀的語法糖,應(yīng)該是一種靈魂思想的注入,簡單寫法的應(yīng)用。非常重要的一點(diǎn)是它很簡單項(xiàng)目背景這個(gè)出發(fā)點(diǎn)很簡單,從擴(kuò)展名稱我們應(yīng)該能猜到它是做什么的。 奇技指南語法糖往往給程序員提供了更實(shí)用的編碼方式,可以使代碼更簡潔流暢,語義更自然。本文介紹筆者自己寫的PHP語法糖擴(kuò)展,擴(kuò)展了一種全新的PHP超全局變量獲取方式。本文作者...
摘要:本周精讀內(nèi)容是逃離地獄。精讀仔細(xì)思考為什么會(huì)被濫用,筆者認(rèn)為是它的功能比較反直覺導(dǎo)致的。同時(shí),筆者認(rèn)為,也不要過渡利用新特性修復(fù)新特性帶來的問題,這樣反而導(dǎo)致代碼可讀性下降。 本周精讀內(nèi)容是 《逃離 async/await 地獄》。 1 引言 終于,async/await 也被吐槽了。Aditya Agarwal 認(rèn)為 async/await 語法讓我們陷入了新的麻煩之中。 其實(shí),筆者...
摘要:本次發(fā)布標(biāo)志著新的重要的系列的開始。經(jīng)過社區(qū)投票,新項(xiàng)目命名為。結(jié)果如下結(jié)果如下四新特性標(biāo)量類型聲明有兩種模式強(qiáng)制默認(rèn)和嚴(yán)格模式。已廢棄的和函數(shù)已被移除。在中,如果發(fā)生這種情況,會(huì)引發(fā)錯(cuò)誤,并且返回。 最好的語言發(fā)布了新的版本,一個(gè)劃時(shí)代的大版本:PHP7。 PHP7修復(fù)了大量BUG,新增了功能和語法糖。這些改動(dòng)涉及到了核心包、GD庫、PDO、ZIP、ZLIB等熟悉和不熟悉的核心功能與...
摘要:提供給了用戶大量的語法糖,比如泛型自動(dòng)裝箱拆箱循環(huán)變長參數(shù)內(nèi)部類枚舉類斷言新特性方法引用等解語法糖語法糖的存在主要是方便開發(fā)人員使用。 首先,部分總結(jié)文字引用 簡書作者:Eric新之助 。鏈接:https://www.jianshu.com/p/4de08deb6ba4 已獲得授權(quán) showImg(https://segmentfault.com/img/bVbfuX9?w=646&...
閱讀 2185·2021-09-02 15:11
閱讀 1507·2019-08-30 15:43
閱讀 2073·2019-08-29 13:48
閱讀 2790·2019-08-26 13:55
閱讀 2100·2019-08-23 15:09
閱讀 2896·2019-08-23 14:40
閱讀 3422·2019-08-23 14:23
閱讀 2632·2019-08-23 14:20