文章目录
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
只有Error
和 Exception
这两个实现。
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