兩行代碼給 PHP7 添加一個“非空合并”文法糖

來源:互聯網
上載者:User
我們知道從 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;"1

Enjoy IT!

私博地址:http://0x1.im

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.