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

资源魔 33 0

咱们晓得从 PHP 5.3 起三元运算符 ? : 有一个写法简约写法是这样的:

<?php
$a = 0;
$b = $a ?: 1; # $b === 1

这实际上相称于:

<?php
$a = 0;
$b = $a ? $a : 1; # $b === 1

正在 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 的前提判别:

<?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 $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!

保举教程:《PHP7》

以上就是给 PHP7 增加一个“非空兼并”语法糖的具体内容,更多请存眷资源魔其它相干文章!

标签: php PHP7 php7开发教程 php7开发资料 php7开发自学

抱歉,评论功能暂时关闭!