php7 不向后的兼容的变更
php7 不向后的兼容的变更
在php7中,很多致命错误以及可恢复的致命错误,都被转换为异常来处理了。
这些异常继承自Error类,此类实现了Throwable接口(所有异常都实现了这个基础接口)
这就意味着,当发生错误的时候,以前的代码中的一些错误处理代码将无法被触发。因为在php7版本中,已经使用抛出异常的错误处理机制了。(如果代码中没有捕获Error的异常,那么会引发致命错误)
php7中的错误处理的更完整描述,请参见 php 7 错误处理 本迁移指导主要是列出对兼容性有影响的变更.
当内部构造器失败的时候,总是抛出异常
在之前的版本中,如果内部类的构造器出错,会返回null或者一个不可用的对象。从php7开始,如果内部类构造器发生错误,那么会抛出异常。
解析错误会抛出ParseError异常
原有的E_STRICT 警告都被迁移到其他级别。E_STRICT常量会被保留,所有以调用error_reporting(E_ALL|E_STRICT)不会引发错误
变量控制的变更
现在 php7 使用新的抽象语法树 去解析 源文件 。这意味着,在早先php版本中不能改进的一些问题被改善了,提高了性能。
间接变量、属性、方法的变更
间接访问的变量,属性,方法,将严格按照从左到右的顺序执行,目的是解决以前的一些复杂问题。下面这个表格展示了以前php和php7的执行顺序的变更
表达式 php5的顺序 php7顺序
list() 函数的变更
list函数不在逆序赋值
这个通常在通过数组赋值时有影响
比如:
php5 会输出
php7 会输出
php7 版本 还不是很推荐去依赖这个顺序,因为这个新特性可能会在未来又一次变更,所以大家这个知道就好,开发中尽量少使用.
list函数 不在支持空的赋值,
比如以下 一些赋值都是不允许的
list 不在支持对string变量 解包 , 请使用 str_split()函数代替
当数组元素是被引用参数赋值自动产生时,数组的顺序的变更
如下:
php5 会输出:
php7 会输出:
global 仅 支持简单变量
如下:
在函数的参数里使用带双括号函数是无效的,会报出warning
如下:
以上会输出:
foreach的变化(这个比较重要,开发使用频繁)
在php7之前,当数组通过foreach迭代时,数组指针会移动。现在开始,不在如此,见下面代码:
php5会输出:
php7会输出:
foreach 通过值遍历时,操作的值为数组的副本
当默认使用通过值遍历数组时,foreach实际操作的是数组的迭代副本,而非数组本身。这就意味着,foreach中的操作不会修改原数组的值
foreach通过引用遍历时,有更好的迭代特性
当使用引用遍历数组时,现在 foreach 在迭代中能更好的跟踪变化。例如,在迭代中添加一个迭代值到数组中,参考下面的代码:
php5 会输出:
php7 会输出:
非Traversable对象的遍历
迭代一个非Traversable对象将会与迭代一个引用数组的行为相同。这将导致在对象添加或删除属性时,foreach 通过引用遍历时,有更好的迭代特性也能被应用。
integer的变更
以前一个无效的八进制数组默认是被截断,现在无效的会导致一个解析错误。 例如(0128 截断为 012)
负位移
按负数位移,会抛出一个ArithmeticError异常
比如:
php5会输出:
php7会输出:
超出范围的位移
如果integer位移超出了integer的位宽,会返回0
除以0的变更
在以前的版本中,在/和%中使用0 会触发一个 E_WARNING,返回结果false.
php7中 会返回 float型的 +INF , -INF , 或 NAN。
抛出一个DivisionByZeroError 异常
比如:
php5输出:
php7输出:
string 处理上的调整
喊十六进制字符串不再被认为是数字
例如:
php5输出:
php7输出
filter_var() 函数可以用于检查一个string是否含有十六进制数字,并将其转换为integer
例如:
\u{ 可能引起错误
由于新的Unicode codepoint excape syntax语法,紧连着无效序列并包含\u{的字符串可能引起致命错误。为了避免这一报错,应该避免使用反斜杠开头。
被移除的函数
call_user_method() 和 call_user_method_array()
call_user_func() 和 call_user_func_array() 从php4.1.0开始被废弃,你可以
考虑使用 变量函数 或者 ... 操作符
mcrypt aliases
已废弃的 mcrypt_generic_end() 函数已被移除,请使用mcrypt_generic_deinit()代替。
此外,已废弃的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和 mcrypt_ofb() 函数已被移除,请配合恰当的MCRYPT_MODE_* 常量来使用 mcrypt_decrypt()进行代替。
intl aliases
已废弃的 datefmt_set_timezone_id() 和 IntlDateFormatter::setTimeZoneID() 函数已被移除,请使用 datefmt_set_timezone() 与 IntlDateFormatter::setTimeZone()代替。
set_magic_quotes_runtime(), 和它的别名 magic_quotes_runtime()已被移除. 它们在PHP 5.3.0中已经被废弃,并且 在in PHP 5.4.0也由于魔术引号的废弃而失去功能。
已废弃的 set_socket_blocking() 函数已被移除,请使用stream_set_blocking()代替。
GD 扩展 PostScript Type1 fonts 被移除的函数如下:
- imagepsbbox()
- imagepsencodefont()
- imagepsextendfont()
- imagepsfreefont()
- imagepsloadfont()
- imagepsslantfont()
- imagepstext()
建议使用TrueType fonts 和它们的关联函数 而代替上面的函数
删除 INI 指令
下面的INI指令被删除,同时关联的特性也被删除
xsl.security_prefs
xsl.security_prefs 指令已经被删除,在每个每个处理器基础上使用XsltProcessor::setSecurityPrefs()方法代替,
其他向后兼容相关的变更
new 操作符 创建的对象不能以引用方式复制给变量
例如:
php5输出:
php7 输出:
无效的类、接口以及 trait 命名
不能以下列名字来命名类、接口以及 trait:
- bool
- int
- float
- string
- NULL
- TRUE
此外,也不要使用下列的名字来命名类、接口以及 trait。虽然在 PHP 7.0 中, 这并不会引发错误, 但是这些名字是保留给将来使用的。
移除了 ASP 和 script PHP 标签
例如:
php5输出:
php7输出:
php7 不向后的兼容的变更的更多相关文章
- Drawable 着色的后向兼容方案
看到 Android Weekly 最新一期有一篇文章:Tinting drawables,使用 ColorFilter 手动打造了一个TintBitmapDrawable,之前也看到有些文章使用这种 ...
- 转载: Centos7 升级python3,解决升级后不兼容问题
Centos7配置更新国内yum源 http://blog.csdn.net/qingguiyu/article/details/50721956 Centos7 升级python3,解决升级后不兼容 ...
- php7.3升级后CI框架session失效session不能读取的问题
php7.3升级后CI框架session失效session不能读取的问题 框架ci3.0.2,php服务器从5升级到7.x后发现session失效了ci无法设置session的问题根本原因在,libr ...
- Django3.0中向后不兼容的更改
3.0中向后不兼容的更改 数据库后端API 本节描述了第三方数据库后端中可能需要的更改. 现在的第二个参数DatabaseIntrospection.get_geometry_type()是行描述,而 ...
- django模板中变更数据库信息后,如何把变更后的信息同步更新到数据库
我们在基于django开发项目的过程中,经常会遇到数据库表字段增加,删除,或者修改的情况,以及字段属性更改的情况,因为django基于ORM模式来操作数据库的, 传统上如果django项目中的数据库m ...
- iOS后向兼容:如何发现过期接口
以4.3以下兼容性为例,在项目预编译头文件(xx.pch)中加入如下代码: #import <Availability.h> #define __AVAILABILITY_INTERNAL ...
- VMware虚拟机打开后不兼容
在版本VMware Workstation10.0设置兼容性,在编辑——首选项——工作空间——设置EXS兼容.计算机工作区域打开虚拟机,右键管理.兼容性从新配置
- Centos7 安装python3详细教程,解决升级后不兼容问题
一.确认当前python版本 [root@centos Python-3.6.1]# python Python 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC ...
- wdcp升级php5.8到php7.1.12后安装redis
一.安装redis a.下载redis: redis最新稳定版下载http://www.redis.io/download wget http://download.redis.io/releases ...
随机推荐
- 【迪杰斯特拉双关键字最短路】【HDU3790】【最短路径问题】
题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 只需要再更新的时候判断一下就好 voi ...
- RDLC报表系列(二) 行分组
接上一篇文章的内容,今天来说的是行分组.还是打开demo1.rdlc界面,拖入一个文本框和表 1.在表中随便选择一个字段,不然在添加行组的时候不会自动提示.我这里是选择的Dept 2.在下面的行组中右 ...
- 解决IP地址被占用问题
问题背景: 在公司一直有同事在抱怨IP地址总是被占用的问题,我决定用技术解决这个问题 解决方案: 1 最开始想在防火墙里面做IP和mac地址绑定,做了几个之后,还是有同事在说IP被占用,后来 分析了一 ...
- 实现Jquery触发一事件后,停留5秒,再接着触发下面的事件
这里是一个广告位的Jquery的代码,有两个不同的广告位,一个是中间浮动显示的,显示5秒后自动消失,并限定每天仅出现一次(Cookie实现): //=====================广告位的j ...
- LeetCode之ReverseWorldString
题目:将一个英文句子翻转,比如:the sky is blue 翻转后变为:blue is sky the 分析:我的实现方法是,利用栈将单词存储起来,然后再顺序拿出来,单词进栈还需注意添加空格. 主 ...
- WebApp 里Meta标签大全
1.先说说mate标签里的viewport: viewport即可视区域,对于桌面浏览器而言,viewport指的就是除去所有工具栏.状态栏.滚动条等等之后用于看网页的区域.对于传统WEB页面来说,9 ...
- linux 机器出现or type control d to continue问题的处理办法
当出现这个界面时,主要是因为磁盘问题 直接输入root密码进入修复模式 在命令行下执行fsck命令 进行相关挂载目录或是磁盘的修改 看下 /etc/fatab下是否有 自己加的开机自动挂载的目录 ,看 ...
- 在Linux手动把文件转码的方法,防止乱码出现
iconv -f utf-8 -t gb2312 report.html > report_test.html
- ODI11G 在Linux上的安装配置
ODI11G 在Linux上的安装配置 OS环境:Red hat Linux x86_64 一.JDK安装 1. 去oracle官网上下载 http://www.oracle.com/technetw ...
- Java日期时间使用(转)
Java日期时间使用总结 转自:http://lavasoft.blog.51cto.com/62575/52975/ 一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个 ...