php7 对比 php5 的一些改变

文章目录

PHP7的变更

下面大概列一些点,都是一些新增加的特性,主要是为了自己记忆,想详细了解的再去百度

  • 新增了一些操作符<=>、??(减少代码量)
  • 增加了返回类型和标量类型的声明(与C++类似,指定参数的类型和返回值的类型)
  • 增加了常量数组(可以直接定义一个常量数组)
  • 增加匿名类(直接用 new class 给一个变量赋值一个匿名类对象)
  • 增加Closure::call()方法($funcName->call(new className)、向类绑定匿名函数)
  • 增加了上下文敏感的词法分析(不是太了解)

下面一些改动,都是我自己大概整理的,不能保证完全准确

错误和异常处理相关的变更

php7相对于php5改变了大多数错误的报告方式,现在很多错误可以被当作异常抛出,错误和异常一样,可以被第一个匹配的 try / catch 块所捕获,如果没有匹配的cache块,最终也会被事先在set_exception_handler中注册的异常处理函数进行处理。如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

<?php
// PHP 5 时代的代码将会出现问题
function handler(Exception $e) { ... }
set_exception_handler('handler');

// 兼容 PHP 5 和 7
function handler($e) { ... }

// 仅支持 PHP 7
function handler(Throwable $e) { ... }

Throwable只有ErrorException这两个实现。

php 预定义的错误和异常
Predefined Exceptions 预定义异常 可由系统自动抛出:https://www.php.net/manual/en/reserved.exceptions.php

SPL Exceptions SPL 标准规范异常 可供开发者规范代码自行抛出
https://www.php.net/manual/en/spl.exceptions.php

统一了变量语法
  • 间接变量、属性和方法引用都按照从左到右的顺序进行解释:
  • global关键字现在只能引用简单变量
  • 用括号把变量或者函数括起来没有用了
  • 引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了。
  • 官方文档:https://wiki.php.net/rfc/uniform_variable_syntax
PHP7增加了抽象语法树

PHP7 的内核其中一个重要的变化是加入了 AST(抽象语法树,它分离了解析和编译的过程)

  • PHP5中,从 php 脚本到 opcodes 的执行的过程是

Lexing:词法扫描分析,将源文件转换成 token 流;
Parsing:语法分析,在此阶段生成 op arrays。

  • PHP7 中,从 php 脚本到 opcodes 的执行的过程是

在语法分析阶段不再直接生成 op arrays,而是先生成 AST,所以过程多了一步:
Lexing:词法扫描分析,将源文件转换成 token 流;
Parsing:语法分析,从 token 流生成抽象语法树;
Compilation:从抽象语法树生成 op arrays。

为什么PHP7有性能提升

以下几点是抄的,有时间把这些再详细理解一下

  • 变量存储字节减小,减少内存占用,提升变量操作速度
  • 改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
  • 改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

后记

以上内容,很多出自官方文档
https://www.php.net/manual/zh/migration70.incompatible.php
https://www.php.net/manual/zh/language.errors.php7.php

上一篇:php7安装composer


下一篇:PHP7内核-变量的内部实现