新增特性和改变:
1.declare(strict_type=1);
如果不开启strict_type,PHP将会尝试帮你转换成要求的类型,而开启之后,会改变PHP就不再做类型转换,类型不匹配就会抛出错误
2. 更多的Error变为可捕获的Exception
比如调用一个不存在的函数
3.加入了AST(抽象语法树)
①什么是AST?
例如:result = 6 + 7 * 3 用抽象语法树表示
②什么是opcodes?
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL
=③从 php 脚本到 opcodes 的执行的过程
PHP5:
Lexing:词法扫描分析,将源文件转换成 token 流;
Parsing:语法分析,在此阶段生成 op arrays。
PHP7:
Lexing:词法扫描分析,将源文件转换成 token 流;
Parsing:语法分析,从 token 流生成抽象语法树;
Compilation:从抽象语法树生成 op arrays。
④为什么要用AST?
从以上的步骤来看,这比之前的过程还多了一步,所以按常理来说这反而会增加程序的执行时间和内存的使用。但事实上内存的使用确实增加了,但是执行时间上却有所降低。
如果仅仅是时间上的优化,似乎也不是使用 AST 的充足理由。其实实现 AST 并不是基于时间优化上的考虑,而是为了解决语法上的问题。
yield 不需要括号
括号不影响行为
list() 的变化
引用赋值的顺序
__clone 方法可以直接调用
4.新增操作符号 ?? <=>
$c = $a <=> $b
如果$a > $b, $c 的值为1
如果$a == $b, $c 的值为0
如果$a < $b, $c 的值为-1
??
$username = isset($_GET['user]) ? $_GET['user] : 'nobody';
$username = $_GET['user'] ?? 'nobody';
5.define() 定义常量数组
define('ARR',['a','b']);
echo ARR[1];// a
6.匿名函数
$anonymous_func = function(){return 'function';};
echo $anonymous_func(); // 输出function
7.Unicode字符格式支持(echo “\u{9999}”)
8.命名空间引用优化
// PHP7以前语法的写法
use FooLibrary\Bar\Baz\ClassA;
use FooLibrary\Bar\Baz\ClassB;
// PHP7新语法写法
use FooLibrary\Bar\Baz\{ ClassA, ClassB};
网友评论