摘要:今天在公司實(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
摘要:最近在做的項(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...
摘要:最近在做的項(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...
摘要:背景升級(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ì)步驟 安裝...
閱讀 742·2023-04-25 19:28
閱讀 1400·2021-09-10 10:51
閱讀 2397·2019-08-30 15:55
閱讀 3420·2019-08-26 13:55
閱讀 3009·2019-08-26 13:24
閱讀 3335·2019-08-26 11:46
閱讀 2763·2019-08-23 17:10
閱讀 1424·2019-08-23 16:57