摘要:添加了一個合并操作符,用于簡化的條件判斷它相當于僅僅是判斷,在為等值時還是會返回的值還是為。
我們知道從 PHP 5.3?起三元運算符 ? : 有一個寫法簡潔寫法是這樣的:
這實際上相當于:
在 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 的條件判斷:
它相當于:
僅僅是 isset 判斷,在 $a 為 0 等值時還是會返回 $b 的值還是為 0 。
這個操作符的語法分析語句是:
| expr T_COALESCE expr { $$ = zend_ast_create(ZEND_AST_COALESCE, $1, $3); }如果想將 isset 換成 empty 的效果,也就是說在變量不存在或轉換成 boolean 后為 false 都賦予其他值,需要這樣寫:
顯然上面的表達式中中間一部分稍微有些多余,那么做些簡化呢?
現在我想添加一個語法 ??: ,它的作用是對變量做 empty 的判斷。也就是說達到上面 $a ?? 1 ?: 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;" 1Enjoy IT!
私博地址:http://0x1.im
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21208.html
摘要:雖然是一個比較操作符,確實一個賦值操作符號。從實際的工程經驗上來說,這個操作符確實能簡化判斷。這也不是第一個三個字符組成的操作符除此之外還有。 我在翻看 PHP 的 RFC 列表的時候發現了一篇不算新的,但很有意思的 rfc:空合并賦值操作符 (姑且就這么翻譯吧)。 它會引起我的注意的還有一個原因是我之前寫過這樣一篇文章:兩行代碼給 PHP7 添加一個非空合并語法糖,里面講的是添加一個...
摘要:本文介紹筆者自己寫的語法糖擴展,擴展了一種全新的超全局變量獲取方式。優秀的語法糖,應該是一種靈魂思想的注入,簡單寫法的應用。非常重要的一點是它很簡單項目背景這個出發點很簡單,從擴展名稱我們應該能猜到它是做什么的。 奇技指南語法糖往往給程序員提供了更實用的編碼方式,可以使代碼更簡潔流暢,語義更自然。本文介紹筆者自己寫的PHP語法糖擴展,擴展了一種全新的PHP超全局變量獲取方式。本文作者...
摘要:本周精讀內容是逃離地獄。精讀仔細思考為什么會被濫用,筆者認為是它的功能比較反直覺導致的。同時,筆者認為,也不要過渡利用新特性修復新特性帶來的問題,這樣反而導致代碼可讀性下降。 本周精讀內容是 《逃離 async/await 地獄》。 1 引言 終于,async/await 也被吐槽了。Aditya Agarwal 認為 async/await 語法讓我們陷入了新的麻煩之中。 其實,筆者...
摘要:提供給了用戶大量的語法糖,比如泛型自動裝箱拆箱循環變長參數內部類枚舉類斷言新特性方法引用等解語法糖語法糖的存在主要是方便開發人員使用。 首先,部分總結文字引用 簡書作者:Eric新之助 。鏈接:https://www.jianshu.com/p/4de08deb6ba4 已獲得授權 showImg(https://segmentfault.com/img/bVbfuX9?w=646&...
閱讀 2217·2021-09-02 15:11
閱讀 1536·2019-08-30 15:43
閱讀 2083·2019-08-29 13:48
閱讀 2803·2019-08-26 13:55
閱讀 2111·2019-08-23 15:09
閱讀 2908·2019-08-23 14:40
閱讀 3438·2019-08-23 14:23
閱讀 2648·2019-08-23 14:20