项目php升级,php5升级到php7后容易采坑的几个点

be21d84cbbf5808fac5f66911da033d7.png

虽然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不再会移动数组内部指针

$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在使用引用传递遍历对象时,可以自动感知数组值的变化

$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系列的数学函数:

// 不开强数据类型模式下

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值