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