给 PHP7 添加一个“非空合并”语法糖

咱们知叙从 PHP 5.3 起三元运算符 必修 : 有一个写法简练写法是如许的:

<选修php
$a = 0;
$b = $a 必修: 1; # $b === 1
登录后复造

那实践上至关于:

<必修php
$a = 0;
$b = $a 选修 $a : 1; # $b === 1
登录后复造

正在 PHP5 外,语法说明是如许写的:

|   expr &#39;必修&#39; { zend_do_begin_qm_op(&$1, &$两 TSRMLS_CC); }
    expr &#39;:&#39; { zend_do_qm_true(&$4, &$两, &$5 TSRMLS_CC); }
    expr     { zend_do_qm_false(&$$, &$7, &$二, &$5 TSRMLS_CC); }
|   expr &#39;必修&#39; &#39;:&#39; { zend_do_jmp_set(&$1, &$两, &$3 TSRMLS_CC); }
    expr     { zend_do_jmp_set_else(&$$, &$5, &$两, &$3 TSRMLS_CC); }
登录后复造

正在 PHP7 外,因为 AST(形象语法树)的引进,语法说明有些简化:

|   expr &#39;选修&#39; expr &#39;:&#39; expr
        { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, $3, $5); }
|   expr &#39;必修&#39; &#39;:&#39; 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 $二 等标识表记标帜的数字透露表现的皆是变质或者者常质浮现的职位地方挨次):

|   expr T_COALESCE &#39;:&#39; 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!

引荐学程:《php7/" target="_blank">PHP7》

以上等于给 PHP7 加添一个“非空归并”语法糖的具体形式,更多请存眷萤水红IT仄台其余相闭文章!

点赞(40) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部