教你用两行代码给PHP7添加一个“非空合并”语法糖
我们知道从 PHP 5.3 起三元运算符 ? : 有一个写法简洁写法是这样的:
|
1 2 3 |
|
这实际上相当于:
|
1 2 3 |
|
在 PHP5 中,语法分析是这样写的:
|
1 2 3 4 5 |
|
在 PHP7 中,由于 AST(抽象语法树)的引入,语法分析有些简化:
|
1 2 3 4 |
|
PHP7 中语法分析之后都是写到 AST 的节点上。从上面可以看出,简化的 ?: 和完整的三元表达式的区别就是节点中间的值为 NULL。
PHP7 添加了一个合并操作符(T_COALESCE),用于简化 isset 的条件判断:
|
1 2 |
|
它相当于:
|
1 2 |
|
仅仅是 isset 判断,在 为等值时还是会返回b 的值还是为 0 。
这个操作符的语法分析语句是:
|
1 2 |
|
如果想将 isset 换成 empty 的效果,也就是说在变量不存在或转换成 boolean 后为 false 都赋予其他值,需要这样写:
|
1 2 |
|
显然上面的表达式中中间一部分稍微有些多余,那么做些简化呢?
现在我想添加一个语法 ??: ,它的作用是对变量做 empty 的判断。也就是说达到上面 $a ?? 1 ?: 1 的效果:
|
1 2 |
|
改起来很简单,只需要将 ?: 和 ?? 的分析合并一下(注意这里和上面所有的地方 $1 $2 等符号的数字表示的都是变量或者常量出现的位置顺序):
|
1 2 3 |
|
仅仅只有两句,因为并没有在词法分析器中添加 Token,所以只能算是个语法糖。
重新编译一下之后就能看到效果啦。
测试:
|
1 2 3 4 |
|
以上就是教你用两行代码给PHP7添加一个“非空合并”语法糖的详细内容,更多请关注php中文网其它相关文章!

浙公网安备 33010602011771号