PHP5.4升級到PHP7.0不兼容處列表及代碼改寫策略

序號 要點 改變 改寫方案
1 類、接口和 trait 的保留關鍵字

bool、int、float、string、NULL、TRUE、FALSEphp

如用到,更名處理
2

十六進制字符串mysql

不在看成數字(數值型表示仍是支持的,只是字符串樣式的不在自動轉換) 去掉兩邊的引號,或者兩邊的引號改小括號
3 包含 \u{ 字符串 因爲新的 Unicode codepoint escape syntax語法,\u{會引發解析,好比"\u{aa}" 在php5輸出會是原樣,如今會輸出對應的字符 雙引號改單引號
4 以點號 ( . ) 結束的數值 JSON 擴展已經被 JSOND 取代,這些都不在不支持 點號後加0或者去掉點號
5 用e前面有點號的科學計數法表示的數值
6 用空字符串表示的json串 用"[]"代替
7 $HTTP_RAW_POST_DATA 移除 用 file_get_contents('php://input')
8

INI 文件中 # 註釋格式(適用於 php.ini 以用 parse_ini_file() 和 parse_ini_string() 函數來處理的文件)sql

移除 用分號( ; )取代
9 相似表達式 $$foo['bar']['baz'] 的變量 解析成 ${$foo['bar']['baz']} 變爲 {$$foo}['bar']['baz'] 用 ${$foo['bar']['baz']}
10 相似表達式 $foo→$bar['baz'] 的變量 解析成 $foo→{$bar['baz']} 變爲 {$foo→$bar}['baz'] 用 $foo→{$bar['baz']}
11 相似表達式 $foo→$bar['baz']() 的變量 解析成 $foo→{$bar['baz']}() 變爲 ${foo→$bar}['baz']() 用 $foo→{$bar['baz']}()
12 相似表達式 Foo::$bar['baz']() 的變量 解析成 Foo::{$bar['baz']}() 變爲 {Foo::$bar}['baz']() 用 Foo::{$bar['baz']}()
13 配置指令 xsl.security_prefs  移除 用 XsltProcessor::setSecurityPrefs() 
14 global聲明變量的範圍 只接受簡單變量,相似 gloabl $$a 的用法不在支持; 用 global ${$a} 的方法處理
15 new 語句建立的對象以引用的方式賦值給變量 觸發 Deprecated 改成拋出異常 去掉 new 前的 &
16

yieldjson

變爲右連運算符 用 (yield)
17 foreach 遍歷數組 原數組移動指針當前位置變成不移動 用 next() 移動
18

Switch 語句包含多個 default 塊數組

觸發異常錯誤 保留最後一個default,其他刪除
19 list 給無字符索引數組賦值 賦值順序從右到左變爲從左到右 array_reverse() 處理一下
20

空的 list() 賦值session

移除 直接賦空值或刪除相關代碼
21 list 分解字符串 移除 str_split()
22 函數引用傳參 非使用變量引用傳參的會觸發Notice 先把值先賦給一個變量,在以此爲參數調用函數
23

自定義的會話處理器(session handler)的使用的函數php7

發生錯誤時,報錯由 error 變成 warningsocket

加判斷是否發生錯誤不可用,如發生錯誤,拋異常
24 構造函數出錯 由返回null或不可用對象 變成 拋出異常 try {} catch(ParseError $e){ return null; } 處理一下
25 函數定義中包含多個參數同名 觸發異常錯誤 同一個函數中重名的參數更名
26

set_exception_handler() 函數

指定的處理函數收到的入參類型不必定是 Exception 對象oop

指定的處理函數入參類型設置由Exception改成Throwable ,示例:

function handler(Exception $e) { ... }
set_exception_handler('handler');

改成

function handler(Throwable $e) { ... }
set_exception_handler('handler');

27 dl() 在 PHP-FPM 再也不可用 直接修改 php.ini 的設置加載相關模塊吧?
28 mysql 擴展 移除 用 mysqli
29 mssql 擴展 移除 用 sqlsrv
30

ereg 擴展

移除 用 preg
31

call_user_method() 

移除
 
用 call_user_func()
32

call_user_method_array()

用 call_user_func_array()
33 mcrypt_generic_end()  用 mcrypt_generic_deinit()
34 mcrypt_ecb()

加密用

mcrypt_encrypt ($cipher , $key , $data , 'ecb'|'cbc'|'cfb'|'ofb' [, string $iv] )

解密用:

mcrypt_decrypt ($cipher , $key , $data , 'ecb'|'cbc'|'cfb'|'ofb' [, string $iv] )

35 mcrypt_cbc()
36 mcrypt_cfb() 
37 mcrypt_ofb() 
38

imagepsbbox()

已從GD擴展支持中移除 用TrueType 字體和相關的函數替代
39

imagepsencodefont()

40

imagepsextendfont()

41 imagepsfreefont()
42 imagepsloadfont()
43 imagepsslantfont()
44 imagepstext()
45 func_get_arg() 不在用初值而是函數體內改變過的當前值 函數體內第一行調用,記錄其值

 
46 func_get_args()
47 debug_backtrace() 
48 datefmt_set_timezone_id()  移除 用 datefmt_set_timezone() 
49 IntlDateFormatter::setTimeZoneID()  移除 用 IntlDateFormatter::setTimeZone()
50

set_socket_blocking() 

移除 stream_set_blocking()
51  json_decode() 處理的json串只支持包含小寫的字面量 truefalse  null  truefalse  null若有大寫的,改爲小寫
52 php_logo_guid() 移除  
53 php_egg_logo_guid() 移除  
54 php_real_logo_guid() 移除  
55 zend_logo_guid() 移除  
56 split() 移除 用preg_split()

需迴歸測試注意的變更

這些錯誤原來不會觸發報錯,如今會了,若是原來的項目中存在有相關的錯誤(隱患bug),那麼如今會報出來:

  1. 數值溢出處理(如:浮點數轉整數),處理方式由自動截斷不報錯變爲觸發E_WARNING 報錯,返回null

  2. 含無效字符的八進制數值,原來靜默刪除無效字符變爲觸發解析錯誤

  3. 負位移運算,之前返回數值0,如今觸發報運算錯誤;

  4. 超範圍後產生位移 ,返回數值0

  5. set_magic_quotes_runtime()  相關常量在5.4就被移除了

可忽略的修改

  1. 解析錯誤會拋出 ParseError 異常,無需修改,原來直接error退出,如今可try catch了

  2. 經過引用賦值建立數組,數組的順序改變

備註

主要參考php手冊

《php5.4x遷移到php5.5不兼容的變動》

http://php.net/manual/zh/migration55.incompatible.php

《php5.5x遷移到php5.6不兼容的變動》

http://php.net/manual/zh/migration56.incompatible.php

《php5.6x遷移到php7.0不兼容的變動》

http://php.net/manual/zh/migration70.incompatible.php

注:手冊參考中《E_STRICT 警告級別變動》表部分中文「再也不警告,會引起錯誤」屬於誤譯,原文「Notice removed, triggers no error」,意思是不在觸發報錯,實測也沒有觸發報錯。

相關文章
相關標籤/搜索