《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,bool,array,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、阅读源码的工具,可一一尝试。

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

  1. JavaSE 学习笔记之Jdk5.0新特性(十九)

    Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性. --------------------- ...

  2. 《PHP7底层设计与源码实现》学习笔记2——结构体对齐

    书里给了一段代码,假如有个结构体如下: struct test {     char a;     int b;     long c;     void* d;     int e;     cha ...

  3. Java学习笔记——JDK1.7的新特性。

    1,switch中可以使用字串 Java代码: String s = "test"; switch (s) { case "test" : System.out ...

  4. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  5. RESTful接口设计原则/最佳实践(学习笔记)

    RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...

  6. amazeui学习笔记二(进阶开发1)--项目结构structure

    amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...

  7. 2017年学习的三个CSS新特性

    这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...

  8. FAT文件系统规范v1.03学习笔记---3.根目录区之FAT目录项结构

    1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...

  9. zepto 源码 $.contains 学习笔记

    $.contains(parent,node)  返回值为一个布尔值 ==> boolean parent,node我们需要检查的节点检查父节点是否包含给定的dom节点,如果两者是相同的节点,返 ...

随机推荐

  1. 【前端_js】javascript中数组的map()方法

    数组的map()方法用于遍历数组,每遍历一个元素就调用回调方法一次,并将回调函数的返回结果作为新数组的元素,被遍历的数组不会被改变. 语法:let newAarray = arr.map(functi ...

  2. k8s krew 插件管理工具

    参考:https://github.com/kubernetes-sigs/krew https://int32bit.me/2019/12/05/%E5%88%86%E4%BA%AB%E5%87%A ...

  3. rhel7学习第五天

    管道命令符的功能的确强大!

  4. 使用aptitude安装软件

    linux的版本依赖问题很令人纠结,不过我们可以通过使用aptitude软件包管理器来解决这个依赖问题,aptitude是可以选择合适的版本与匹配软件安装.

  5. 运用软链接,解决NBU默认安装目录空间不足

    建立软链接实例: 例如 /usr 剩余空间5G,/opt剩余空间100G 提前在通过如下命令在/opt 目录下创建openv文件夹 mkdir -p /opt/openv 然后进入 /opt/open ...

  6. locust手机号批量注册性能测试

    from locust import TaskSet,task,HttpLocust from common.redisCon import redis_clusters import queue c ...

  7. vue - 过滤器-钩子函数路由

    一.关于路由 1.使用vue router 本质上是声明一种可以通过路径进行 挂子,用子 找到对应的 template 进行页面渲染 <!DOCTYPE html> <html la ...

  8. 没有该栏目数据, 可能缓存文件(/data/cache/inc_catalog_base.inc)没有更新, 请检查是否有写入权限

    今天朋友在创建新栏目时出现了一个无法生成的错误,提示没有该栏目数据, 可能缓存文件(/data/cache/inc_catalog_base.inc)没有更新, 请检查是否有写入权限,其实这个相对比较 ...

  9. PHP随机获取预设的值

    前面我们讲了php怎么获取随机数,<?php echo rand(1000,2000); ?> 一行代码就能搞定,如果要获取ASP,PHP,JAVASCRIPT,AJAX,CSS,JQUE ...

  10. hadoop 参数大全

    方法一.可以通过hadoop官方网址查询, 网址如下: http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ ...