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”,意思是不在触发报错,实测也没有触发报错。

相关文章
相关标签/搜索