php7 不向后的兼容的变动php
在php7中,不少致命错误以及可恢复的致命错误,都被转换为异常来处理了。
数组
这些异常继承自Error类,此类实现了Throwable接口(全部异常都实现了这个基础接口)php7
这就意味着,当发生错误的时候,之前的代码中的一些错误处理代码将没法被触发。由于在php7版本中,已经使用抛出异常的错误处理机制了。(若是代码中没有捕获Error的异常,那么会引起致命错误)socket
php7中的错误处理的更完整描述,请参见 php 7 错误处理 本迁移指导主要是列出对兼容性有影响的变动.
函数
当内部构造器失败的时候,老是抛出异常post
在以前的版本中,若是内部类的构造器出错,会返回null或者一个不可用的对象。从php7开始,若是内部类构造器发生错误,那么会抛出异常。性能
解析错误会抛出ParseError异常spa
原有的E_STRICT 警告都被迁移到其余级别。E_STRICT常量会被保留,全部以调用error_reporting(E_ALL|E_STRICT)不会引起错误.net
变量控制的变动指针
如今 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 被移除的函数以下:
建议使用TrueType fonts 和它们的关联函数 而代替上面的函数
删除 INI 指令
下面的INI指令被删除,同时关联的特性也被删除
xsl.security_prefs
xsl.security_prefs
指令已经被删除,在每一个每一个处理器基础上使用XsltProcessor::setSecurityPrefs()方法代替,
new 操做符 建立的对象不能以引用方式复制给变量
例如:
php5输出:
php7 输出:
无效的类、接口以及 trait 命名
不能如下列名字来命名类、接口以及 trait:
此外,也不要使用下列的名字来命名类、接口以及 trait。虽然在 PHP 7.0 中, 这并不会引起错误, 可是这些名字是保留给未来使用的。
移除了 ASP 和 script PHP 标签
例如:
php5输出:
php7输出: