摘要:添加了一个合并操作符,用于简化的条件判断它相当于仅仅是判断,在为等值时还是会返回的值还是为。
我们知道从 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;"
$ /usr/local/php/bin/php -r "$a = 0; echo $a ??: 1, PHP_EOL;"
Enjoy IT!
私博地址:http://0x1.im
...起我的注意的还有一个原因是我之前写过这样一篇文章:两行代码给 PHP7 添加一个“非空合并”语法糖,里面讲的是添加一个 ??: 操作符的方法, 而现在要讲的这个,已经被接受的 rfc 里添加的操作符是: ??=。
由于这个事情本...
izhuhaodev
...南语法糖往往给程序员提供了更实用的编码方式,可以使代码更简洁流畅,语义更自然。本文介绍笔者自己写的PHP语法糖扩展,扩展了一种全新的PHP超全局变量获取方式。本文作者范家鹏,360技术委员会--WEB服务端分TC委员。
1、...
warkiz
回到我们吐槽的回调地狱,虽然代码比较丑,带起码两行回调代码并不会带来阻塞。
看来语法的简化,带来了性能问题,而且直接影响到用户体验,是不是值得我们反思一下?
正确的做法应该是先同时执行函数,再 await 返...
2shou
最好的语言发布了新的版本,一个划时代的大版本:PHP7。
PHP7修复了大量BUG,新增了功能和语法糖。这些改动涉及到了核心包、GD库、PDO、ZIP、ZLIB等熟悉和不熟悉的核心功能与扩展包。
PHP7移除了已经被废弃的函数,如mysql_系...
Channe