《PHP7底层设计与源码实现》学习笔记1——PHP7的新特性和源码结构


《PHP7底层设计与源码实现》一书的作者陈雷亲自给我们授课,大佬现身!但也因此深感自己基础薄弱,遂买了此书。希望看完这本书后,能让我对PHP7底层的认识更上一层楼。好了,言归正传,本书共14章,此篇笔记是1~2章的总结,主要介绍了PHP7的新特性、执行原理和PHP源码结构。 一、PHP7的新特性  
新特性 PHP7+ 老版本可以这样做
太空船操作符 <=> 太空船操作符又叫组合比较符,用于比较两个表达式,表达式可以为整型、浮点型、字符串。   \$a <=> \$b,当 \$a 大于、等于、小于 \$b 时,其结果分别是1、0、-1。 strcmp(str1, str2) 或 strcasecmp(str1, str2),二进制安全比较字符串,前者区分大小写,后者不区分大小写。 如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
null合并操作符 ?? NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二个操作数。 \$page = $_GET['page'] ?? 1; 三元表达式: \$page = isset(\$_GET['page']) ? \$_GET['page'] : 1;
define定义常量数组 支持 define 语法定义数组类的常量 define('COLORS', [     'red',     'black',     'white' ]); 支持 const 语法定义数组类的常量 const COLORS = [     'red',     'black',     'white' ];
namespace批量导入 use space\{ClassA, ClassB, ClassC}; use space\ClassA; use space\ClassB; use space\ClassC;
标量类型声明/ 返回值类型声明 类型声明有两种模式:
  • 弱类型校验模式(默认):当传入的参数不符合声明类型时,会首先尝试转换类型。
  • 严格类型校验模式:当传入的参数不符合声明类型时,直接报错。
声明严格模式的语法: declare(strict_types=1); //1严格类型校验模式,0弱类型校验模式
int,float,string,boolarray,class,interface,callable array,class,interface,callable
----------以下均为PHP7+新特性----------
标量类型声明 返回值类型声明
可变参数,是指参数数量不固定的函数形式。参数类型和参数变量之间用3个点(...)组成。 <?php function 函数名(paraType ...$variable) : returnType {     #code... }     返回值类型声明为void时,函数中只可以用“return;”或省略return语句。 当试图获取一个void方法的返回值时,将被迫返回null。 <?php function sumOfInts(int ...$ints) : void {     return; } var_dump(sumOfInts(2,3,4)); 运行结果:NULL 如果上面代码改为如下所示: <?php function sumOfInts(int ...$ints) : void {     return array_sum($ints); } var_dump(sumOfInts(2,3,4)); 运行结果:500 Internal Server Error
可空类型:在参数或返回值类型声明前面加上“?”,表示参数值或返回值要么是null,要么是声明的类型。 <?php function 函数名(?paraType ...$variable) : ?returnType {     #code... } 注:参数类型和返回值类型可以不同时为可空类型,但当参数值为 null 时,则参数和返回值类型必须同时为可空类型。
throwable接口 throwable接口由 Exception 和部分 Error 实现,当代码中有语法错误或fatal error时,这种 Error 可以像 Exception 一样被匹配的 try/catch块捕获,即 try {     #code...; } catch (Error $e) {     #code...; } 如果没有匹配的 catch 块,则调用异常处理函数,即 set_exception_handler() 如果未注册异常处理函数,则按照传统方式处理(fatal error)。 代码中有语法错误或fatal error,程序直接报错退出。
还有很多新特性,在此不一一赘述。   二、PHP7程序的执行过程 1.PHP代码经过词法分析转换为有意义的Token; 2.Token经过语法分析生成AST(Abstract Synstract Syntax Tree,抽象语法树); 3.AST生成对应的opcode,被虚拟机执行。 、PHP7的源码结构 此外,书中还介绍了调试PHP7、阅读源码的工具,可一一尝试。