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()代替。

  dl() in PHP-FPM

  dl()在 PHP-FPM 不再可用,在 CLI 和 embed SAPIs 中仍可用。

GD 扩展 PostScript Type1 fonts 被移除的函数如下:

  

建议使用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 不向后的兼容的变更的更多相关文章

  1. Drawable 着色的后向兼容方案

    看到 Android Weekly 最新一期有一篇文章:Tinting drawables,使用 ColorFilter 手动打造了一个TintBitmapDrawable,之前也看到有些文章使用这种 ...

  2. 转载: Centos7 升级python3,解决升级后不兼容问题

    Centos7配置更新国内yum源 http://blog.csdn.net/qingguiyu/article/details/50721956 Centos7 升级python3,解决升级后不兼容 ...

  3. php7.3升级后CI框架session失效session不能读取的问题

    php7.3升级后CI框架session失效session不能读取的问题 框架ci3.0.2,php服务器从5升级到7.x后发现session失效了ci无法设置session的问题根本原因在,libr ...

  4. Django3.0中向后不兼容的更改

    3.0中向后不兼容的更改 数据库后端API 本节描述了第三方数据库后端中可能需要的更改. 现在的第二个参数DatabaseIntrospection.get_geometry_type()是行描述,而 ...

  5. django模板中变更数据库信息后,如何把变更后的信息同步更新到数据库

    我们在基于django开发项目的过程中,经常会遇到数据库表字段增加,删除,或者修改的情况,以及字段属性更改的情况,因为django基于ORM模式来操作数据库的, 传统上如果django项目中的数据库m ...

  6. iOS后向兼容:如何发现过期接口

    以4.3以下兼容性为例,在项目预编译头文件(xx.pch)中加入如下代码: #import <Availability.h> #define __AVAILABILITY_INTERNAL ...

  7. VMware虚拟机打开后不兼容

    在版本VMware Workstation10.0设置兼容性,在编辑——首选项——工作空间——设置EXS兼容.计算机工作区域打开虚拟机,右键管理.兼容性从新配置

  8. Centos7 安装python3详细教程,解决升级后不兼容问题

    一.确认当前python版本 [root@centos Python-3.6.1]# python Python 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC ...

  9. wdcp升级php5.8到php7.1.12后安装redis

    一.安装redis a.下载redis: redis最新稳定版下载http://www.redis.io/download wget http://download.redis.io/releases ...

随机推荐

  1. 依赖注入及AOP简述(三)——依赖注入的原理

    3.     “依赖注入”登场 于是诸多优秀的IT工程师开始想出了更加轻量便利.更加具有可测试性和可维护性的设计模式——IoC模式.IoC,即Inversion of Control的缩写,中文里被称 ...

  2. C++中socket编程

    原文:http://blog.csdn.net/cuiran/article/details/5854794 Server端 #include <WINSOCK2.H> #include ...

  3. 普通用户登录Oracle DB Control

    使用 sys 或者 system 用户登录 Oracle DB Control 是没有问题的. 但是,如果是普通的用户需要登录Oracle DB Control,建表或者视图之类的, 则需要授权 SE ...

  4. hdu 4707 Pet hdu 2013 Asia Regional Online —— Warmup

    一道简单的搜索题目,建一个树,根节点是 0 ,连接的两个节点的距离是 1 ,求 到 根节点长度是2的节点的个数. #include<stdio.h> #include<string. ...

  5. HDU 1045(Fire Net)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...

  6. Qt3D教程

    美其名曰教程 其实就是自己的学习之旅 惯例第一章是qt3d的安装 首先说下环境 Windows_Xp_sp3 下载链接 Qt library 4.8.5 下载链接 (在安装Qt library之前,需 ...

  7. zend guard loader

    1 .是zendoptimizer的前身, 在php 5.3 (含)之前使用更新到6 ,5.4 之后不再使用.是代码优化的一种,7中opcache 类似功效. 2 .php版本的变量 phpversi ...

  8. J2SE知识点摘记(一)

    1.        数组的声明时无法指定数组的长度. 2.        一维数组的声明和内存的分配 "数据类型    数组名[]; //声明一维数组     数组名=  new 数据类型[ ...

  9. Codeforces 325D

    #include <cstdio> #include <algorithm> #include <cstring> #include <cstdlib> ...

  10. 图片文件,图片文件流和BASE64加密字符串之间的转换,以及图片的BASE64加密字符串再jsp上如何显示

    http://blog.csdn.net/sidongxue2/article/details/43036373