成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

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

oysun / 3549人閱讀

摘要:今天在公司實(shí)現(xiàn)一個(gè)模塊功能時(shí)寫(xiě)了如下代碼居然報(bào)錯(cuò)在編譯階段就通不過(guò)了錯(cuò)誤信息意思很明顯但我的代碼里面并不是一個(gè)表達(dá)式啊,這讓我百思不得其解我?guī)е苫笤诩依镏匦虑孟铝巳缟洗a,編譯通過(guò)正常運(yùn)行查看版本而公司的開(kāi)發(fā)機(jī)上運(yùn)行的是那么,為什么

今天在公司實(shí)現(xiàn)一個(gè)模塊功能時(shí)寫(xiě)了如下代碼:

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

居然報(bào)錯(cuò), 在編譯階段就通不過(guò)了.

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

錯(cuò)誤信息意思很明顯, 但我的代碼isset里面并不是一個(gè)表達(dá)式啊,這讓我百思不得其解.
我?guī)е苫笤诩依镏匦虑孟铝巳缟洗a,編譯通過(guò), 正常運(yùn)行.
php -v查看版本, 7.1. 而公司的開(kāi)發(fā)機(jī)上運(yùn)行的是php5.6

那么,為什么會(huì)造成這樣的差異呢?只能翻看源碼看isset的底層實(shí)現(xiàn).

眾所周知, isset不是函數(shù), 而是語(yǔ)法結(jié)構(gòu), 那么如果發(fā)生錯(cuò)誤, 在編譯階段就會(huì)出錯(cuò).

對(duì)比一下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)"); }
;

很明顯,在詞法解析的時(shí)候, 類(lèi)常量被定義成非變量了

看一看expr_without_variable的定義, 在該文件的776行到858行, 我們找到了這樣一個(gè)定義:

    |    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; }

恍然大悟, 類(lèi)常量被定義為非變量, 所以?huà)伋鼍幾g錯(cuò)誤.

而在php7.0+版本

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

是被去掉了的. 所以編譯通過(guò), 并成功運(yùn)行.

也不知道這個(gè)算是bug, 還是5.6的feature~~~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29294.html

相關(guān)文章

  • PHP7 mongoDB擴(kuò)展使用

    摘要:最近在做的項(xiàng)目需要將升級(jí)到,使用過(guò)擴(kuò)展的同學(xué)應(yīng)該知道,的擴(kuò)展是完全不兼容的擴(kuò)展的,改如何使用呢。 最近在做的項(xiàng)目需要將PHP5.6升級(jí)到PHP7.0,使用過(guò)PHP-mongo擴(kuò)展的同學(xué)應(yīng)該知道,PHP7.0的mongodb擴(kuò)展是完全不兼容PHP5.6的mongo擴(kuò)展的,php-mongodb改如何使用呢。 下面直接說(shuō)明各種方法的使用: 1.mongodb連接: private func...

    objc94 評(píng)論0 收藏0
  • PHP7 mongoDB擴(kuò)展使用

    摘要:最近在做的項(xiàng)目需要將升級(jí)到,使用過(guò)擴(kuò)展的同學(xué)應(yīng)該知道,的擴(kuò)展是完全不兼容的擴(kuò)展的,改如何使用呢。 最近在做的項(xiàng)目需要將PHP5.6升級(jí)到PHP7.0,使用過(guò)PHP-mongo擴(kuò)展的同學(xué)應(yīng)該知道,PHP7.0的mongodb擴(kuò)展是完全不兼容PHP5.6的mongo擴(kuò)展的,php-mongodb改如何使用呢。 下面直接說(shuō)明各種方法的使用: 1.mongodb連接: private func...

    Paul_King 評(píng)論0 收藏0
  • Ubuntu 16.04 切換 PHP 版本

    摘要:背景升級(jí)都一年了,新版的倉(cāng)庫(kù)自帶的是而今天突然要對(duì)某個(gè)老項(xiàng)目進(jìn)行維護(hù),發(fā)現(xiàn)版本太高,某些函數(shù)已經(jīng)被取消了所以查了一下怎么快捷的切換版本,這里做個(gè)筆記。 背景 升級(jí) Ubuntu 16.04 都一年了,新版的倉(cāng)庫(kù)自帶的 PHP 是 7+;而今天突然要對(duì)某個(gè)老項(xiàng)目進(jìn)行維護(hù),發(fā)現(xiàn) PHP 版本太高,某些函數(shù)已經(jīng)被取消了;所以查了一下怎么快捷的切換 PHP 版本,這里做個(gè)筆記。 詳細(xì)步驟 安裝...

    kun_jian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

oysun

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<