资讯专栏INFORMATION COLUMN

两行代码给 PHP7 添加一个“非空合并”语法糖

zhangyucha0 / 1555人阅读

摘要:添加了一个合并操作符,用于简化的条件判断它相当于仅仅是判断,在为等值时还是会返回的值还是为。

我们知道从 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21208.html

相关文章

  • 一个神奇的操作符即将加入PHP

    摘要:虽然是一个比较操作符,确实一个赋值操作符号。从实际的工程经验上来说,这个操作符确实能简化判断。这也不是第一个三个字符组成的操作符除此之外还有。 我在翻看 PHP 的 RFC 列表的时候发现了一篇不算新的,但很有意思的 rfc:空合并赋值操作符 (姑且就这么翻译吧)。 它会引起我的注意的还有一个原因是我之前写过这样一篇文章:两行代码给 PHP7 添加一个非空合并语法糖,里面讲的是添加一个...

    izhuhaodev 评论0 收藏0
  • SG :一个简单的PHP语法扩展

    摘要:本文介绍笔者自己写的语法糖扩展,扩展了一种全新的超全局变量获取方式。优秀的语法糖,应该是一种灵魂思想的注入,简单写法的应用。非常重要的一点是它很简单项目背景这个出发点很简单,从扩展名称我们应该能猜到它是做什么的。 奇技指南语法糖往往给程序员提供了更实用的编码方式,可以使代码更简洁流畅,语义更自然。本文介绍笔者自己写的PHP语法糖扩展,扩展了一种全新的PHP超全局变量获取方式。本文作者...

    warkiz 评论0 收藏0
  • 精读《async/await 是把双刃剑》

    摘要:本周精读内容是逃离地狱。精读仔细思考为什么会被滥用,笔者认为是它的功能比较反直觉导致的。同时,笔者认为,也不要过渡利用新特性修复新特性带来的问题,这样反而导致代码可读性下降。 本周精读内容是 《逃离 async/await 地狱》。 1 引言 终于,async/await 也被吐槽了。Aditya Agarwal 认为 async/await 语法让我们陷入了新的麻烦之中。 其实,笔者...

    2shou 评论0 收藏0
  • PHP 7 新特征

    摘要:本次发布标志着新的重要的系列的开始。经过社区投票,新项目命名为。结果如下结果如下四新特性标量类型声明有两种模式强制默认和严格模式。已废弃的和函数已被移除。在中,如果发生这种情况,会引发错误,并且返回。 最好的语言发布了新的版本,一个划时代的大版本:PHP7。 PHP7修复了大量BUG,新增了功能和语法糖。这些改动涉及到了核心包、GD库、PDO、ZIP、ZLIB等熟悉和不熟悉的核心功能与...

    Channe 评论0 收藏0
  • JAVA语法语法编译

    摘要:提供给了用户大量的语法糖,比如泛型自动装箱拆箱循环变长参数内部类枚举类断言新特性方法引用等解语法糖语法糖的存在主要是方便开发人员使用。 首先,部分总结文字引用 简书作者:Eric新之助 。链接:https://www.jianshu.com/p/4de08deb6ba4 已获得授权 showImg(https://segmentfault.com/img/bVbfuX9?w=646&...

    weakish 评论0 收藏0

发表评论

0条评论

zhangyucha0

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<