PHP7添加非空合并语法分析

今天小编就为大家带来一篇PHP7添加非空合并语法分析的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。

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

以上就是PHP7添加非空合并语法的分析内容,详细使用情况还得要大家自己使用过才能知道具体要领。如果想阅读更多相关内容的文章,欢迎关注网站那些事行业资讯频道!

原创文章,作者:KJWVL,如若转载,请注明出处:http://www.wangzhanshi.com/n/7087.html

(0)
KJWVL的头像KJWVL
上一篇 2025年1月1日 16:38:09
下一篇 2025年1月1日 16:38:11

相关推荐

  • phpstudy中MySQL数据库无法启动的解决方法

    phpstudy数据库无法启动有以下几个原因。 一、自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突,从而造成ph…

    2024年12月17日
  • PHP7 新增intdiv()函数的使用方法

    PHP 7 新增加了 intdiv() 函数,intdiv代表整数除法即对除法结果取整。这个函数返回给定被除数和除数除法的整数商。该函数从内部删除被除数的余数,使其能被除数整除并在…

    php 2025年1月1日
  • PHP5对象simplexml的实例用法

    PHP5对象simplexml是一个新增的针对XML的一个对象。我们将会在这篇文章中对PHP5对象simplexml的属性和方法进行详细的介绍,希望大家能够通过本文对这新增对象有一…

    php 2025年1月2日
  • 如何使用Vue scoped和deep

    众所周知,在组件中给style 标签添加属性 scoped 属性可以避免组件内样式对外界造成污染,scoped使得组件内的样式变成局域样式,只作用于当前组件。 原理如下&#8212…

    php 2025年1月2日
  • php7性能提升原因

    PHP7性能提升原因总结: 1、存储变量的结构体变小,尽量使结构体里成员共用内存空间,减少引用,这样内存占用降低,变量的操作速度得到提升。 2、字符串结构体的改变,字符串信息和数据…

    php 2025年1月1日
  • PHP操作ZipArchive实现文件上传下载功能

    概述 在很多实际生产场景都需要批量上传、下载一些文件的处理,整理了使用PHP语言操作ZipArchive实践和实例,ZipArchive需要服务器上安装zlib库,php扩展中安装…

    php 2024年12月17日
  • 怎么在CentOS78中安装PHP7

    1. CentOS7的默认PHP版本是PHP5,但是如果我们要安装PHP7,不需要将现有的PHP5删除,只要将PHP升级到PHP7即可。 使用 yum provides php 命…

    php 2025年1月1日
  • php安装phalcon扩展的步骤

    Phalcon 是开源、全功能栈、使用 C 扩展编写、针对高性能优化的 PHP 5 框架。 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来,…

    2025年1月1日
  • 如何修改php7 错误处理机制修改

    本文实例讲述了php7 错误处理机制修改。分享给大家供大家参考,具体如下: 一、现在有两个异常类:Exception and Error. PHP7现在有两个异常类,Excepti…

    2025年1月1日
  • PHP7中如何获取数组的第一或最后一个键

    数组的第一 / 最后一个键 (PHP 7.3) 从 PHP 7.3 开始,你可以很容易地得到数组的第一个键和最后一个键: $array = [ &#0…

    php 2025年1月1日

发表回复

登录后才能评论