资讯专栏INFORMATION COLUMN

isset在php5.6-和php7.0+的一些差异

oysun / 3525人阅读

摘要:今天在公司实现一个模块功能时写了如下代码居然报错在编译阶段就通不过了错误信息意思很明显但我的代码里面并不是一个表达式啊,这让我百思不得其解我带着疑惑在家里重新敲下了如上代码,编译通过正常运行查看版本而公司的开发机上运行的是那么,为什么

今天在公司实现一个模块功能时写了如下代码:

class ProductCategory
{
    const TYPES = [
        1 => "type1",
        2 => "type2",  
    ];
    
    public function getType()
    {
        return isset(self::TYPES[$this->type]) ? self:TYPES[$this->type] : "unrecognized_type";
    }
}

居然报错, 在编译阶段就通不过了.

Fatal error: Cannot use isset() on the result of an expression (you can use "nul
l !== expression" instead)

错误信息意思很明显, 但我的代码isset里面并不是一个表达式啊,这让我百思不得其解.
我带着疑惑在家里重新敲下了如上代码,编译通过, 正常运行.
php -v查看版本, 7.1. 而公司的开发机上运行的是php5.6

那么,为什么会造成这样的差异呢?只能翻看源码看isset的底层实现.

众所周知, isset不是函数, 而是语法结构, 那么如果发生错误, 在编译阶段就会出错.

对比一下php5.6和php7.0+版本的zend_language_parse.y

在php5.6版本中的zend_language_parse.y的1283行

isset_variable:
        variable                { zend_do_isset_or_isempty(ZEND_ISSET, &$$, &$1 TSRMLS_CC); }
    |    expr_without_variable    { zend_error_noreturn(E_COMPILE_ERROR, "Cannot use isset() on the result of an expression (you can use "null !== expression" instead)"); }
;

很明显,在词法解析的时候, 类常量被定义成非变量了

看一看expr_without_variable的定义, 在该文件的776行到858行, 我们找到了这样一个定义:

    |    combined_scalar_offset { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); }

再看combined_scalar_offset 的定义:

general_constant "[" dim_offset "]" { zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }

再看general_constant 的定义:

class_constant { $$ = $1; }

恍然大悟, 类常量被定义为非变量, 所以抛出编译错误.

而在php7.0+版本

combined_scalar_offset { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); }

是被去掉了的. 所以编译通过, 并成功运行.

也不知道这个算是bug, 还是5.6的feature~~~

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

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

相关文章

  • PHP7 mongoDB扩展使用

    摘要:最近在做的项目需要将升级到,使用过扩展的同学应该知道,的扩展是完全不兼容的扩展的,改如何使用呢。 最近在做的项目需要将PHP5.6升级到PHP7.0,使用过PHP-mongo扩展的同学应该知道,PHP7.0的mongodb扩展是完全不兼容PHP5.6的mongo扩展的,php-mongodb改如何使用呢。 下面直接说明各种方法的使用: 1.mongodb连接: private func...

    objc94 评论0 收藏0
  • PHP7 mongoDB扩展使用

    摘要:最近在做的项目需要将升级到,使用过扩展的同学应该知道,的扩展是完全不兼容的扩展的,改如何使用呢。 最近在做的项目需要将PHP5.6升级到PHP7.0,使用过PHP-mongo扩展的同学应该知道,PHP7.0的mongodb扩展是完全不兼容PHP5.6的mongo扩展的,php-mongodb改如何使用呢。 下面直接说明各种方法的使用: 1.mongodb连接: private func...

    Paul_King 评论0 收藏0
  • Ubuntu 16.04 切换 PHP 版本

    摘要:背景升级都一年了,新版的仓库自带的是而今天突然要对某个老项目进行维护,发现版本太高,某些函数已经被取消了所以查了一下怎么快捷的切换版本,这里做个笔记。 背景 升级 Ubuntu 16.04 都一年了,新版的仓库自带的 PHP 是 7+;而今天突然要对某个老项目进行维护,发现 PHP 版本太高,某些函数已经被取消了;所以查了一下怎么快捷的切换 PHP 版本,这里做个笔记。 详细步骤 安装...

    kun_jian 评论0 收藏0

发表评论

0条评论

oysun

|高级讲师

TA的文章

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