PHP5.4升级到PHP7.0不兼容处列表及代码改写策略

序号要点改变改写方案
1类、接口和 trait 的保留关键字

bool、int、float、string、NULL、TRUE、FALSE

如用到,改名处理
2

十六进制字符串

不在当作数字(数值型表示还是支持的,只是字符串样式的不在自动转换)去掉两边的引号,或者两边的引号改小括号
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() 函数来处理的文件)

移除用分号( ; )取代
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() 
14global声明变量的范围只接受简单变量,类似 gloabl $$a 的用法不在支持;用 global ${$a} 的方法处理
15new 语句创建的对象以引用的方式赋值给变量触发 Deprecated 改为抛出异常去掉 new 前的 &
16

yield

变为右连运算符用 (yield)
17foreach 遍历数组原数组移动指针当前位置变成不移动用 next() 移动
18

Switch 语句包含多个 default 块

触发异常错误保留最后一个default,其余删除
19list 给无字符索引数组赋值赋值顺序从右到左变为从左到右array_reverse() 处理一下
20

空的 list() 赋值

移除直接赋空值或删除相关代码
21list 分解字符串移除str_split()
22函数引用传参非使用变量引用传参的会触发Notice先把值先赋给一个变量,在以此为参数调用函数
23

自定义的会话处理器(session handler)的使用的函数

发生错误时,报错由 error 变成 warning

加判断是否发生错误不可用,如发生错误,抛异常
24构造函数出错由返回null或不可用对象 变成 抛出异常try {} catch(ParseError $e){ return null; } 处理一下
25函数定义中包含多个参数同名触发异常错误同一个函数中重名的参数改名
26

set_exception_handler() 

指定的处理函数收到的入参类型不一定是 Exception 对象

指定的处理函数入参类型设置由Exception改为Throwable ,示例:

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

改为

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

27dl()在 PHP-FPM 不再可用直接修改 php.ini 的设置加载相关模块吧?
28mysql 扩展移除用 mysqli
29mssql 扩展移除用 sqlsrv
30

ereg 扩展

移除用 preg
31

call_user_method() 

移除
 
用 call_user_func()
32

call_user_method_array()

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

加密用

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

解密用:

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

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

imagepsbbox()

已从GD扩展支持中移除用TrueType 字体和相关的函数替代
39

imagepsencodefont()

40

imagepsextendfont()

41imagepsfreefont()
42imagepsloadfont()
43imagepsslantfont()
44imagepstext()
45func_get_arg()不在用初值而是函数体内改变过的当前值函数体内第一行调用,记录其值

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

set_socket_blocking() 

移除stream_set_blocking()
51 json_decode()处理的json串只支持包含小写的字面量 truefalse  null truefalse  null如有大写的,改成小写
52php_logo_guid()移除 
53php_egg_logo_guid()移除 
54php_real_logo_guid()移除 
55zend_logo_guid()移除 
56split()移除用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”,意思是不在触发报错,实测也没有触发报错。

转载于:https://my.oschina.net/u/1164352/blog/2874642

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值