摘要:今天在公司實現一個模塊功能時寫了如下代碼居然報錯在編譯階段就通不過了錯誤信息意思很明顯但我的代碼里面并不是一個表達式啊,這讓我百思不得其解我帶著疑惑在家里重新敲下了如上代碼,編譯通過正常運行查看版本而公司的開發機上運行的是那么,為什么
今天在公司實現一個模塊功能時寫了如下代碼:
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~~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29294.html
摘要:最近在做的項目需要將升級到,使用過擴展的同學應該知道,的擴展是完全不兼容的擴展的,改如何使用呢。 最近在做的項目需要將PHP5.6升級到PHP7.0,使用過PHP-mongo擴展的同學應該知道,PHP7.0的mongodb擴展是完全不兼容PHP5.6的mongo擴展的,php-mongodb改如何使用呢。 下面直接說明各種方法的使用: 1.mongodb連接: private func...
摘要:最近在做的項目需要將升級到,使用過擴展的同學應該知道,的擴展是完全不兼容的擴展的,改如何使用呢。 最近在做的項目需要將PHP5.6升級到PHP7.0,使用過PHP-mongo擴展的同學應該知道,PHP7.0的mongodb擴展是完全不兼容PHP5.6的mongo擴展的,php-mongodb改如何使用呢。 下面直接說明各種方法的使用: 1.mongodb連接: private func...
摘要:背景升級都一年了,新版的倉庫自帶的是而今天突然要對某個老項目進行維護,發現版本太高,某些函數已經被取消了所以查了一下怎么快捷的切換版本,這里做個筆記。 背景 升級 Ubuntu 16.04 都一年了,新版的倉庫自帶的 PHP 是 7+;而今天突然要對某個老項目進行維護,發現 PHP 版本太高,某些函數已經被取消了;所以查了一下怎么快捷的切換 PHP 版本,這里做個筆記。 詳細步驟 安裝...
閱讀 731·2023-04-25 19:28
閱讀 1391·2021-09-10 10:51
閱讀 2390·2019-08-30 15:55
閱讀 3408·2019-08-26 13:55
閱讀 2996·2019-08-26 13:24
閱讀 3325·2019-08-26 11:46
閱讀 2751·2019-08-23 17:10
閱讀 1415·2019-08-23 16:57