今天小编就为大家带来一篇PHP7添加非空合并语法分析的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。
10年的全州网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整全州建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“全州网站设计”,“全州网站推广”以来,每个客户项目都认真落实执行。
我们知道从 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
判断,在 为等值时还是会返回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以上就是PHP7添加非空合并语法的分析内容,详细使用情况还得要大家自己使用过才能知道具体要领。如果想阅读更多相关内容的文章,欢迎关注创新互联行业资讯频道!
分享名称:PHP7添加非空合并语法分析
分享地址:http://cdweb.net/article/googio.html