序號 | 要點 | 改變 | 改寫方案 |
---|---|---|---|
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 | 指定的處理函數收到的入參類型不必定是 Exception 對象oop |
指定的處理函數入參類型設置由Exception改成Throwable ,示例: function handler(Exception $e) { ... } 改成 function handler(Throwable $e) { ... } |
|
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 ( 解密用: mcrypt_decrypt ( |
|
35 | mcrypt_cbc() | ||
36 | mcrypt_cfb() | ||
37 | mcrypt_ofb() | ||
38 | 已從GD擴展支持中移除 | 用TrueType 字體和相關的函數替代 | |
39 | |||
40 | |||
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 | 移除 | 用stream_set_blocking() | |
51 | json_decode() | 處理的json串只支持包含小寫的字面量 true,false 和 null | true,false 和 null若有大寫的,改爲小寫 |
52 | php_logo_guid() | 移除 | |
53 | php_egg_logo_guid() | 移除 | |
54 | php_real_logo_guid() | 移除 | |
55 | zend_logo_guid() | 移除 | |
56 | split() | 移除 | 用preg_split() |
這些錯誤原來不會觸發報錯,如今會了,若是原來的項目中存在有相關的錯誤(隱患bug),那麼如今會報出來:
數值溢出處理(如:浮點數轉整數),處理方式由自動截斷不報錯變爲觸發E_WARNING 報錯,返回null
含無效字符的八進制數值,原來靜默刪除無效字符變爲觸發解析錯誤
負位移運算,之前返回數值0,如今觸發報運算錯誤;
set_magic_quotes_runtime() 相關常量在5.4就被移除了
解析錯誤會拋出 ParseError 異常,無需修改,原來直接error退出,如今可try catch了
經過引用賦值建立數組,數組的順序改變
主要參考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」,意思是不在觸發報錯,實測也沒有觸發報錯。