整型数据处理的变化

PHP7 对于 整型 处理的变更


无效的八进制字符(Invalid octal literals)

在之前,一个八进制字符如果含有无效数字,该无效数字将被静默删节(0128 将被解析为 012). 现在这样的八进制字符将产生解析错误。


负位移运算(Negative bitshifts)

以负数形式进行的位移运算将会抛出一个 ArithmeticError:

<?php
var_dump(1 >> -1);
?>

以上程序在 PHP 5 中的输出:

int(0)

以上程序在 PHP 7 中的输出:

Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
  thrown in /tmp/test.php on line 2

超范围后产生位移

超出 integer 位宽的位移操作(无论哪个方向)将始终得到 0 作为结果。在从前,这一操作是结构依赖的。


除以零的变化

之前的版本中,当 0 被做为除数时,无论是除数 (/) 或取模 (%) 操作,都会抛出一个 E_WARNING 错误并返回 false。现在,除法运算符 (/) 会返回一个由 IEEE 754 指定的浮点数:+INF, -INF 或 NAN。取模操作符 (%) 则会抛出一个 DivisionByZeroError 异常,并且不再产生 E_WARNING 错误。

<?php
var_dump(3/0);
var_dump(0/0);
var_dump(0%0);
?>

以上程序在 PHP 5 中的输出:

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

以上程序在 PHP 7 中的输出:

Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d

查看笔记

扫码一下
查看教程更方便