PHP 7 详解
  • 介绍
  • PHP 7 安装
  • PHP 7.0.x 新特性
    • OOP 特性
      • 类型声明
      • 命名空间与use关键词批量声明
      • 匿名类
      • Throwable 接口
    • 新增操作符
      • 太空飞船操作符(<=>)
      • null 合并运算符(??)
    • 统一变量语法
    • 其他特性和变更
      • 常量数组
      • Switch 中的多个default默认值
      • Session_start 函数中的参数数组
      • Unserialize 函数引入过滤器
      • 整数除法函数 intdiv()
      • 补充*其他特性和变更
    • 补充*新函数
    • 补充*新的全局常量
    • 补充*变更的函数
    • 补充*摒弃一些老式的写法
    • 补充*不向后兼容的变更
    • 补充*在SAPI模块的变化
    • 补充*PHP7底层性能优化
  • PHP 7.1.x 新特性
    • 新特性
      • 可为空(Nullable)类型
      • 对称阵列解构
      • Void 函数
      • 类常量访问权限控制
      • 多异常捕获处理
      • list()现在支持键名
      • 支持为负的字符串偏移量
      • 补充*其他特性与变更
    • 补充*新的函数
    • 补充*新增的全局常量
    • 补充:不向后兼容的变更
    • 补充*废弃的特性
    • 补充*变更的函数
    • 补充*其他的变更
  • PHP7 开发工具
    • Eclipse 安装与配置
  • PHP 标准规范及开发技巧
    • PHP 标准规范 - PSR
    • PHP 开发技巧
    • 面向对象编程的基本原则
  • PHP7调试与性能分析
    • 调试 - Xdebug安装配置
      • 使用Eclipse调试
    • 性能分析 - Xhprof
    • 性能分析 - Vld
  • 附录*Ubuntu环境php开发配置
  • 附录*使用php开发扩展
  • 附录*浏览器插件
  • 附录*第三方类库
  • 附录*小问题整理
  • 附录*资料*工具
  • 附录*Composer
  • 附录*前端
  • 附录*进程
  • 附录*PHP的ticks机制
  • 附录* 通过composer发布自己的包
  • 附录*字符编码问题
  • 附录*注释
Powered by GitBook
On this page
  • 不向后兼容的变更
  • 当传递参数过少时将抛出错误
  • 禁止动态调用范围内功能
  • 无效的类、接口和特征名称
  • 数值串转换现在尊重科学符号
  • 修复mt_rand()算法
  • rand()别名为mt_rand()和srand()别名为mt_srand()
  • 不允许在标识符中删除ASCII删除控制字符
  • error_log用syslog值进行更改
  • call_user_func()不再支持对传址的函数的调用
  • 字符串不再支持空索引操作符 The empty index operator is not supported for strings anymore
  • ini配置项移除
  • 在引用赋值过程中自动创建元素的数组顺序发生了变化
  • 等元素的排序 Sort order of equal elements
  • Error message for E_RECOVERABLE errors
  • unserialize() 的$options参数
  • DateTime构造函数包含微秒
  • 错误异常的致命错误转换
  • 词汇绑定的变量不能重用名称
  • JSON编码和解码
  • 对mb_ereg()和mb_eregi()参数语义的更改
  • 停止支持sslv2流

Was this helpful?

  1. PHP 7.1.x 新特性

补充:不向后兼容的变更

Previous补充*新增的全局常量Next补充*废弃的特性

Last updated 6 years ago

Was this helpful?

参考:

不向后兼容的变更

当传递参数过少时将抛出错误

在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception)。这个变更仅对用户定义的函数生效, 并不包含内置函数。例如:

<?php
function test($param){}
test();

Output of the above example in PHP 5.5:

Uncaught Error: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

禁止动态调用范围内功能

对某些函数的动态调用被禁止(以$func()或array_map('extract', ...)等形式)。这些函数可以检查或修改另一个范围,并呈现出模糊和不可靠的行为。其职能如下:

  • - 用一个字符串作为第一个参数

  • - 有一个参数

  • - 有一个参数

<?php
(function () {
    'func_num_args'();
})();

以上例程会输出:

Warning: Cannot call func_num_args() dynamically in %s on line %d

无效的类、接口和特征名称

以下名称不能用于名称类、接口或特征:

  • void

  • iterable

数值串转换现在尊重科学符号

数值操作和数值转换现在要尊重科学符号。这还包括(int)cast操作,以及以下函数:intval()(在这里的基础是10)、settype()、decbin()、decbin()和dechex()。

修复mt_rand()算法

mt_rand()现在默认使用Mersenne Twister算法的固定版本。如果依赖于mt_srand()的确定性输出,则MT_RAND_PHP有能力将旧的(不正确的)实现通过另一个可选的第二个参数来保存mt_srand()。

rand()别名为mt_rand()和srand()别名为mt_srand()

rand()和srand()现在分别对mt_rand()和mt_srand()进行了别名。这意味着下列函数的输出有更改:rand()、shuffle()、str_shuffle()和array_rand()。

不允许在标识符中删除ASCII删除控制字符

ASCII删除控制字符(0x7F)不能再用在没有引用的标识符中。

error_log用syslog值进行更改

如果将error_log ini设置设置为syslog,则将PHP错误级别映射到syslog错误级别。这将在错误日志中提供更细的差异,与前面的方法相反,所有的错误都只在通知级别上记录。

在不完整的对象上不再调用析构方法

析构方法在一个不完整的对象(例如在构造方法中抛出一个异常)上将不再会被调用。

call_user_func()不再支持对传址的函数的调用

字符串不再支持空索引操作符 The empty index operator is not supported for strings anymore

对字符串使用一个空索引操作符(例如$str[] = $x)将会抛出一个致命错误, 而不是静默地将其转为一个数组。

ini配置项移除

下列ini配置项已经被移除:

  • session.entropy_file

  • session.entropy_length

  • session.hash_function

  • session.hash_bits_per_character

在引用赋值过程中自动创建元素的数组顺序发生了变化

数组中元素的顺序已经发生了变化,当这些元素通过引用被引用的赋值自动创建时。例如:

<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>

Output of the above example in PHP 7.0:

array(2) {

["a"]=
>
&
int(1)
  ["b"]=
>
&
int(1)
}

Output of the above example in PHP 7.1:

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}

等元素的排序 Sort order of equal elements

内部排序算法得到了改进,其结果可能是不同的元素顺序,比之前的相等。

不要依赖于元素的顺序,因为元素的顺序是相等的;它可能随时变化。

Error message for E_RECOVERABLE errors

The error message for E_RECOVERABLE errors has been changed from "Catchable fatal error" to "Recoverable fatal error".

unserialize() 的$options参数

unserialize()的$options参数的allowed_classes元素现在被严格输入,即如果给定数组或布尔值之外的其他任何东西,unserialize()将返回FALSE并发出E_WARNING。

DateTime构造函数包含微秒

<?php
new DateTime() == new DateTime();
?>

错误异常的致命错误转换

词汇绑定的变量不能重用名称

通过使用构造绑定到闭包的变量不能使用与任何超全局变量相同的名称,$ this或任何参数。例如,所有这些函数定义都会导致一个致命错误:

<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};

JSON编码和解码

在编码双精度时,serialize_precision ini设置现在控制序列化精度。

现在解码一个空的键会导致一个空的属性名,而不是一个属性名。

<?php
var_dump(json_decode(json_encode(['' => 1])));

以上例程的输出类似于:

object(stdClass)#1 (1) {
  [""]=>
  int(1)
}

对mb_ereg()和mb_eregi()参数语义的更改

如果没有匹配,则将把第三个参数设置为mb_ereg()和mb_eregi()函数(regs),现在将被设置为空数组。Formely,参数不会被修改。

停止支持sslv2流

sslv2流现在已经在OpenSSL中被删除了。

现在在调用一个以引用作为参数的函数时将始终失败。

和不变现在正确地融合了从当前时间构建的微秒,无论是显式的还是相对的字符串。“下个月的第一天”)。这意味着对两个新创建的实例进行简单的比较,现在更有可能返回FALSE而不是TRUE:

详见: ,搜索:Fatal errors toErrorexceptions conversions

当向提供JSON_UNESCAPED_UNICODE标志时,现在转义了U + 2028和U + 2029的序列。

不向后兼容的变更
assert()
compact()
extract()
func_get_args()
func_get_arg()
func_num_args()
get_defined_vars()
mb_parse_str()
parse_str()
call_user_func()
DateTime
DateTimeImmutable
官方
json_encode()