php5升级到php7后容易采坑的几个点

虽然php7已经出来很久了,不过还有不少老旧的项目依然还在php5上坚挺,为了防止以后接手老项目再次采坑,留个存档。
set_exception_handler函数 不再保证收到的一定是 Exception 对象(php5中一定是Exception对象):
- 抛出 Error 对象时,如果 set_exception_handler() 里的异常处理代码声明了类型 Exception ,将会导致 fatal error。
- 想要异常处理器同时支持 PHP5 和 PHP7,应该删掉异常处理器里的类型声明。如果代码仅仅是升级到 PHP7,则可以把类型 Exception 替换成 Throwable。
表达式解析顺序上的不同:
表达式 | php5解析方式 | php7解析方式 |
$$foo['bar']['baz'] | ${$foo['bar']['baz']} | ($$foo)['bar']['baz'] |
$foo->$bar['baz'] | $foo->{$bar['baz']} | ($foo->$bar)['baz'] |
$foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']() |
Foo::$bar['baz']() | Foo::{$bar['baz']}() | (Foo::$bar)['baz']() |
foreach不再会移动数组内部指针
<?php $array = [0, 1, 2]; foreach ($array as $val) { var_dump(current($array)); } //php5 int(1) int(2) bool(false) //php7 int(0) int(0) int(0)
foreach在使用引用传递遍历对象时,可以自动感知数组值的变化
<?php $array = [0]; foreach ($array as &$val) { // 注意这里一定要使用引用传递 var_dump($val); $array[1] = 1; } //php5 int(0) //php7 int(0) int(1)
开启强数据类型模式define(strict_types=1)之后需要特别注意代码中的BCmath系列的数学函数:
<?php // 不开强数据类型模式下 echo bcadd(1,1); // string 2 // 开启强数据类型 echo bcadd(1,1); // Fatal error: Uncaught TypeError: bcadd() expects parameter 1 to be string, integer given
由于BCmath系列函数经常配合mysql或者redis之类的进行数据运算,大多数时候查询出来的数字类型都不是string类型所以特别容易引起抛出异常,并且除了bcscale(bool)、bccomp(int)两个函数其他BC系列函数的返回都是string类型的数值,所以在严格数据模式下要特别注意BCmath系列的函数。
php7.2或7.2以上的版本相比以前容易踩坑的点
get_class在之前的版本传入一个null就可以获取到当前系统中所有类的名称,在7.2之后的版本传入null则会报错,不传值就可以获取到包含所有类的名称。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,非商业性质可转载须署名链接,详见本站版权声明。
发表评论