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

 

 

 

  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输出:

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/Super-Man/p/5034789.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值