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 国际许可协议进行许可,非商业性质可转载须署名链接,详见本站版权声明。

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注