文档章节

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

刘重量
 刘重量
发布于 2018/11/11 16:00
字数 1449
阅读 10
收藏 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() 
14 global声明变量的范围 只接受简单变量,类似 gloabl $$a 的用法不在支持; 用 global ${$a} 的方法处理
15 new 语句创建的对象以引用的方式赋值给变量 触发 Deprecated 改为抛出异常 去掉 new 前的 &
16

yield

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

Switch 语句包含多个 default 块

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

空的 list() 赋值

移除 直接赋空值或删除相关代码
21 list 分解字符串 移除 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');

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

© 著作权归作者所有

共有 人打赏支持
刘重量
粉丝 0
博文 15
码字总数 10751
作品 0
海淀
私信 提问
UPUPW绿色服务器平台PHP7.0开发体验版1507发布

特别说明1:PHP官方从PHP5.5开始不再支持Windows XP和2003,这些系统已经有十年历史,所以PHP7.0也将不再提供支持。 特别说明2:PHP7.0中去掉了一些函数和连接组件等所以旧版开发的大部分网站...

UPUPW
2015/07/18
3.5K
16
ElementaryOS 安装LAMP

debug@debug-Macmini:~/Downloads$ sudo apt-get install apache [sudo] debug 的密码: debug@debug-Macmini:~/Downloads$ sudo apt-get install apache2 [sudo] debug 的密码: 正在读取软......

sizeof
2016/12/29
16
0
服务器全能环境 UPUPW ANK V1.1.6 发布

柚皮Windows服务器集成环境智控平台(以下简称UPUPW ANK)已经持续更新5年多了,主要用于一键部署全能网站运行环境,适用服务器生产环境和本地开发环境。 UPUPW ANK控制面板集成网站运行环境...

UPUPW
2018/11/26
1K
14
UPUPW NGINX 绿色服务器平台 PHP 7.0 体验版发布

特别说明1: UPUPW NGINX版PHP7.0采用Nginx+PHP+MariaDB的架构搭建,PHP7.0去掉了一些函数和连接组件所以旧版开发的大部分网站不能在此平台运行,目前更适合开发人员使用。http://www.upupw.ne...

UPUPW
2015/11/17
2.8K
5
ECMALL 新增对 PHP 7.0 的支持

经过长达1星期的开发与测试,我们已完成了ECMALL与深度定制版代号为(ECMOS)的PHP更新版本升级。目前已经可以支持PHP7.0。ECMALL可以完美运行在PHP7.0系统上。 本次开发是基于ECMOS(ECMALL深度...

bornlau
2017/04/11
1K
10

没有更多内容

加载失败,请刷新页面

加载更多

Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部