《PHP7底层设计与源码实现》学习笔记1——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——PHP7的新特性和源码结构的更多相关文章
- JavaSE 学习笔记之Jdk5.0新特性(十九)
Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性. --------------------- ...
- 《PHP7底层设计与源码实现》学习笔记2——结构体对齐
书里给了一段代码,假如有个结构体如下: struct test { char a; int b; long c; void* d; int e; cha ...
- Java学习笔记——JDK1.7的新特性。
1,switch中可以使用字串 Java代码: String s = "test"; switch (s) { case "test" : System.out ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- RESTful接口设计原则/最佳实践(学习笔记)
RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...
- amazeui学习笔记二(进阶开发1)--项目结构structure
amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...
- 2017年学习的三个CSS新特性
这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...
- FAT文件系统规范v1.03学习笔记---3.根目录区之FAT目录项结构
1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...
- zepto 源码 $.contains 学习笔记
$.contains(parent,node) 返回值为一个布尔值 ==> boolean parent,node我们需要检查的节点检查父节点是否包含给定的dom节点,如果两者是相同的节点,返 ...
随机推荐
- C++ OpenSSL 之三:生成CSR文件
1.等同于使用: openssl req -new -key "key_path" -out "save_path" -subj "/emailAdd ...
- Nginx七层负载均衡的几种调度算法
Nginx是一款轻量级的高性能web服务器,同时也是一款非常优秀的负载均衡器和反向代理服务器.由于支持强大的正则匹配规则.动静分离.URLrewrite功能及安装配置简单且对网络稳定性依赖非常小等 ...
- 将qemu使用的设备树dump出来
像下面的qemu启动命令: sudo qemu-system-aarch64 \ -M virt \ -cpu cortex-a53 \ -smp \ -m 4096M \ -kernel ./lin ...
- 浅析Volatile关键字
浅析Volatile关键字 在java中线程并发中,线程之间通信方式分为两种:共享内存和消息传递.共享内存指的是多个线程之间共享内存的属性状态:消息传递指的是线程之间发送信息来通信.在介绍volati ...
- 工作不久的安卓开发者,他们是这样规划自己的Android学习路线
Android开发工作者工作不久的时候,会有一段迷茫期,觉得自己应该再学一点,却不知道从何学起,该怎样规划自己的学习路线呢?今天,我给大家梳理一下Android基础,就像建造房屋一样,要建造一座宏伟的 ...
- Kth Minimum Clique(2019年牛客多校第二场D题+k小团+bitset)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 找第\(k\)小团. 思路 用\(bitset\)来标记每个结点与哪些结点直接有边,然后进行\(bfs\),在判断新加入的点与现在有的点是否都 ...
- JDK1.8 LocalDate 使用方式;LocalDate 封装Util,LocalDate工具类(二)
未完待续 ........ java.time.*代替方案 1.Instant 代替 Date2.LocalDateTime 代替 Calendar3.DateTimeFormatter 代替 Sim ...
- java.util.ConcurrentModificationException异常;java.util.ConcurrentModificationException实战
写代码遇到这个问题,很多博客文章都是在反复的强调理论,而没有对应的实例,所以这里从实例出发,后研究理论: 一.错误产生情况 1 .字符型 (1)添加 public static void main(S ...
- shell脚本启动所有集群节点
#profile变量追加到.bashrc中 cat /etc/profile >> ~/.bashrc #start-all-cluster.sh 启动脚本 #!/bin/bash ec ...
- Python错误“ImportError: No module named MySQLdb”解决方法
这个错误可能是因为没有安装MySQL模块,这种情况下执行如下语句安装: pip install MySQLdb 如果安装时遇到错误“_mysql.c:29:20: 致命错误:Python.h:没有那个 ...