php8最新版本特性,PHP8 了解新特性
php 8.0 五大更新重点
效能提升
语法扩充
弹性强类别
更加严谨
调节内套件与新增函数
性能测试图表
1607602943417.jpg
PHP 8.0 值得关注的改进
PHP 8.0 引入了 Just In Time (JIT) 编译器,能够进一步提高 PHP 脚本的执行速度。
PHP 8.0 合并了诸多性能优化
JSON 支持现在被视为语言的核心部分,始终可用,而不是作为可选模块。
@1.extension_loaded('json')
@2.function_exists('json_decode')
始终返回true
支持 named 参数,因为它们能够指定参数名称而不是其确切顺序。
支持类/属性/函数/方法/参数/常量的结构化元数据的属性(或在其他语言中也称为注释或修饰符)。
支持可以指示多种不同类型的联合类型,这些类型可以用作参数或函数的返回类型。
支持静态返回类型。
str_contains()函数是一种检查字符串是否包含在另一个字符串中的简便方法,而不必使用strpos等。与之相似的是新的str_starts_with()和str_ends_with()函数,这些函数很容易解释。
添加了Nullsafe运算符,作为在方法上应用空合并行为的快速简便的方法
什么是 JIT
1、动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。
2、JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别。
3、自适应动态编译(adaptive dynamic compilation)也是一种动态编译,但它通常执行的时机比JIT编译迟,先让程序“以某种式”先运行起来,收集一些信息之后再做动态编译。这样的编译可以更加优化。
PHP JIT 运作原理
liuchengtu.png
Opcache 扩展可以更快的获取 Opcodes 将其直接转到 Zend VM,则 JIT 让它们完全不使用 Zend VM 即可运行。
跳过 Zend VM 并直接被 CPU 执行。 从理论上说,性能会更好。
查看phpinfo()
1607618000772.jpg
JIT我们配置 php.ini
opcache.jit=1205
opcache.jit_buffer_size=64M
是否在生成机器码点时候使用AVX指令, 需要CPU支持
0: 不使用
1: 使用
####### 寄存器分配策略
0: 不使用寄存器分配
1: 局部(block)域分配
2: 全局(function)域分配
JIT触发策略
0: PHP脚本载入的时候就JIT
1: 当函数第一次被执行时JIT
2: 在一次运行后,JIT调用次数最多的百分之(opcache.prof_threshold * 100)的函数
3: 当函数/方法执行超过N(N和opcache.jit_hot_func相关)次以后JIT
4: 当函数方法的注释中含有@jit的时候对它进行JIT
5: 当一个Trace执行超过N次(和opcache.jit_hot_loop, jit_hot_return等有关)以后JIT
JIT优化策略,数值越大优化力度越大:
0: 不JIT
1: 做opline之间的跳转部分的JIT
2: 内敛opcode handler调用
3: 基于类型推断做函数级别的JIT
4: 基于类型推断,过程调用图做函数级别JIT
5: 基于类型推断,过程调用图做脚本级别的JIT
关于类名调用测试
php 7.4版本
class ImageService
{
private $src;
private $image;
private $imageinfo;
private $percent = 0.5;
/** 高清压缩图片
* @param string $saveName 提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
*/
public function compressImg($saveName='')
{
}
}
###获取类名 方法一
var_dump (ImageService::class);
//打印结果:string(12) "ImageService"
### 获取类名方法二
$obj = new ImageService();
var_dump(get_class ($obj));
//打印结果:string(12) "ImageService"
php8.0 版本
class ImageService
{
private $src;
private $image;
/** 高清压缩图片
* @param string $saveName 提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
*/
public function compressImg($saveName='')
{
}
}
var_dump($imageObj::class);
//打印结果:string(12) "ImageService"
构造函数可直接定义成员变量
php7.4版本
## php7版本
class MaterialsDao{
private $name;
private $pwd;
public function __construct($name,$pwd)
{
$this->name = $name;
$this->pwd = $pwd;
}
}
var_dump( new MaterialsDao('admin','!$123123%$'));
//打印结果
object(MaterialsDao)#1 (2) {
["name":"MaterialsDao":private]=>
string(5) "admin"
["pwd":"MaterialsDao":private]=>
string(10) "!$123123%$"
}
php8.0版本 直接定义成员变量
## php8版本 构造函数 可直接定义成员变量
class MaterialsPHP8Dao{
public function __construct(private $name,private $pwd)
{
}
}
var_dump( new MaterialsPHP8Dao('admin','!$123123%$'));
//打印结果
object(MaterialsPHP8Dao)#1 (2) {
["name":"MaterialsPHP8Dao":private]=>
string(5) "admin"
["pwd":"MaterialsPHP8Dao":private]=>
string(10) "!$123123%$"
}
字符串的处理
1.判断字符串中是否存在某个字符
php 7.4 版本
$url = "https://www.php.net/releases/8.0/zh.php";
//原来方式@1. strstr
$domain = strstr($url,'http');
echo $domain;
//原来方式@2. strpos
if(strpos($url,'http')!==false || strpos($url,'https')!==false){
echo "包含http或https";
}else{
echo "不包含http";
}
php8.0 版本 新增str_contains函数
$url = "https://www.php.net/releases/8.0/zh.php";
if(str_contains($url,"http")){
echo "包含http或https";
}else{
echo "不包含http";
}
2.判断字符串是否以开头 或 以结尾
php7.4版本
$str = ":测试一下喽";
if (':' == substr($str, 0, 1)) {
echo "ok";
}else{
echo "no";
}
php8.0版本 新增 str_stars_with:开始函数 str_ends_with:结束函数
if(str_starts_with($str,":测试")){
echo "以':测试'开头";
}else{
echo "否";
}
if(str_ends_with($str,"喽")){
echo "以'喽'结束";
}else{
echo "否";
}
3.新的关键字:match, 这个关键字的作用跟switch有点类似。
php7.4版本 switch
switch ($input) {
case "true":
$result = 1;
break;
case "false":
$result = 0;
break;
case "null":
$result = NULL;
break;
}
php 8.0 版本 新关键词match
$result = match($input) {
"true" => 1,
"false" => 0,
"null" => NULL,
};
###多个值
$result = match($input) {
"true", "on" => 1,
"false", "off" => 0,
"null", "empty", "NaN" => NULL,
};
4. 串联优先级
## 串联优先级 测试
$a = 100;
$b = 200;
echo '两数之和:' . $a + $b . PHP_EOL;
// PHP7.* 执行顺序是: ('两数之和:' . $a) + $b .PHP_EOL;
## 打印输出 200
// PHP8执行顺序是: '两数之和:' . ($a + $b) . PHP_EOL;
## 打印输出 300
5. 联合类型 索引
// 参数是联合类型
function paramsUnionType(array|bool $data) {
var_dump($data);
}
// 参数为数组
paramsUnionType(['a', 'd', 'e']);
// 参数为布尔型
paramsUnionType(false);
// 返回值是联合类型
function retUnionType($data) : array|bool|string {
return $data;
}
// 返回值为数组类型
var_dump(retUnionType(['b', 'a', 1]));
// 返回值为布尔类型
var_dump(retUnionType(true));
// 返回值为字符串类型
var_dump(retUnionType('new1024kb'));
// 参数和返回值都是联合类型
function unionType(array|bool $data): bool|array {
return $data;
}
// 数组类型
var_dump(unionType(['a', 'f', 'q']));
// 布尔类型
var_dump(unionType(true));
// 整型(会被转换成bool型 true)
var_dump(unionType(127867));
6.fdiv 函数 允许除数为0
// 除数为0
var_dump(fdiv(2, 0));
var_dump(fdiv(1, 3));
var_dump(fdiv(1, 2));
// intdiv() 对结果取整
// fmod() 返回余数
返回结果:
float(INF)
float(0.3333333333333333)
float(0.5)
get_debug_type和gettype() 区别
$arr = [1, 2, 3];
echo '数组类型' . PHP_EOL;
var_dump('get_debug_type(): '. get_debug_type($arr));
var_dump('gettype(): ' . gettype($arr));
$str = 'new1024kb';
echo '字符串类型' . PHP_EOL;
var_dump('get_debug_type(): ' . get_debug_type($str));
var_dump('gettype(): ' . gettype($str));
echo PHP_EOL;
$i = 1024;
echo '整型' . PHP_EOL;
var_dump('get_debug_type(): ' . get_debug_type($i));
var_dump('gettype(): ' . gettype($i));
echo PHP_EOL;
$str = 10.24;
echo '字符串类型' . PHP_EOL;
var_dump('get_debug_type(): ' . get_debug_type($str));
var_dump('gettype(): ' . gettype($str));
echo PHP_EOL;
$b = false;
echo '布尔型' . PHP_EOL;
var_dump('get_debug_type(): ' . get_debug_type($b));
var_dump('gettype(): ' . gettype($b));
echo PHP_EOL;
class Type{}
$type = new Type();
echo '对象' . PHP_EOL;
var_dump('get_debug_type(): ' . get_debug_type($type));
var_dump('gettype(): ' . gettype($type));
运行结果:
函数
参数int型
参数string型
参数布尔bool型
参数数组array型
对象浮点型
实例化
-
int
string
bool
array
float
实例化
get_debug_type
int
string
bool
array
float
类名
gettype
integer
string
boolean
array
double
object
7. php8 新增参数跳过 参数与顺序无关,且是自描述的。
属性
function named_params($a, $b, $c = 0, $d = 0) {
echo $a."-".$b."-".$c."-".$d;
}
echo "function: ";
named_params(1, 2,d:20 );
##打印结果: 1-2-0-20%
8. NULLsafe
php7.4
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
php8.0
$country = $session?->user?->getAddress()?->country;
9. PHP 8新特性之Attributes 注释
php7.4 版本
/**
* @param $where
* @param string $field
* @return array
*/
function getOne($where, $field='*'){
return [];
}
$ref = new ReflectionFunction("getOne");
var_dump ( $ref->getDocComment());
## 打印结果
string(6) "author"
array(2) {
[0]=>
string(6) "123123"
[1]=>
string(44) "https://stitcher.io/blog/attributes-in-php-8"
}
php8.0
$ref01 = new ReflectionFunction("getOneById");
var_dump($ref01->getAttributes("Params")[0]->getName());
var_dump($ref01->getAttributes("Params")[0]->getArguments());
var_dump($ref01->getAttributes("See")[0]->getName());
var_dump($ref01->getAttributes("See")[0]->getArguments());
string(3) "see"
array(2) {
[0]=>
string(6) "123123"
[1]=>
string(44) "https://stitcher.io/blog/attributes-in-php-8"
}
#[Params("name", "pwd"),author("123123","https://stitcher.io/blog/attributes-in-php-8")]
function getOneByName($name,$pwd){
return boolval (1);
}
$ref01 = new ReflectionFunction("getOneByName");
var_dump($ref01->getAttributes("Params")[0]->getName());
var_dump($ref01->getAttributes("Params")[0]->getArguments());
string(6) "Params"
array(2) {
[0]=>
string(4) "name"
[1]=>
string(3) "pwd"
}
var_dump($ref01->getAttributes("author")[0]->getName());
var_dump($ref01->getAttributes("author")[0]->getArguments());
string(6) "author"
array(2) {
[0]=>
string(6) "123123"
[1]=>
string(44) "https://stitcher.io/blog/attributes-in-php-8"
}
总结
新语法开始面向其他设计語言
PHP 开始活用强型别写发的特性
PHP 正在一步一步的要求严谨
JIT 目前在 PHP 8.0 能提升的情境有限
php8最新版本特性,PHP8 了解新特性相关推荐
- Spring版本特性:Spring各个版本引入了哪些新特性?
Spring是Rod Johnson在2004年推出的一个轻量级框架.对Java EE 系统框架臃肿.低效.脱离现实的种种现状提出了质疑,并积极寻求探索革新之道. spring 1.x时代 在这个时代 ...
- html5加js兼容性辅助,解决低版本IE关于html5新特性的兼容性问题html5shiv.js和Respond.js,以及excanvas.js解决低版本IE不支持canvas的问题...
插件:html5shiv.js 让IE9以下版本支持html5新标签,git地址https://github.com/aFarkas/html5shiv 用于解决IE9以下版本浏览器对HTML5新增标 ...
- Spring版本特性--->Spring各个版本引入了哪些新特性?-1
Spring各个版本引入了那些新特性 Spring版本支持与依赖 Spring Framework版本 Java 标准版 Java 企业版 1.x 1.3+ J2EE 1.3+ 2.x 1.4.2+ ...
- php8最新版本,PHP8 GA版本来了,赶快来玩吧
PHP8 GA版本来了.作为一名PHP开发者而言,这是非常高兴的.PHP8带来了许多特性,尤其是JIT备受关注,尽管JIT对普通应用而言,性能上并没有多大提升,且与PHP7.4相当,但是PHP8的一些 ...
- Spring Data ElasticSearch 3.2版本发布,相关新特性说明
由于ElasticSearch更新的速度非常的快,那么就造成了一些常见的Java交互API更新速度无法匹配最新的版本等情况,比如Spring Data ElasticSearch.对于习惯了使用其他类 ...
- linux内核网络新特性,Linux内核4.4版本带来的网络新特性
本文题目有点大,但其实我只想描述一些我个人一直比较关注的特性,并且不会太详细,跟往常一样,主要是帮忙理清思路的,不会分析源码.这主要是为了哪一天突然忘了的时候,一目十行扫一眼就能记忆当时的理解,不然写 ...
- HTML5 和 CSS3 的新特性--HTML5 的新特性
HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签.新的表单和新的表单属性等. 这些新特性都有兼容性问题,基本是 IE9+ 以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这 ...
- MySQL 8新特性--InnoDB相关新特性
文章目录 6.1. auto-increment 6.2.innodb_deadlock_detect 6.3. INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 6. ...
- java6特性_Java6的新特性
Java语言特性系列 序 本文梳理了下java6的新特性,相对于java5而言,java6的特性显得少些,分量也不那么重,相当于java5是windows xp,java6有点像vista. 特性列表 ...
最新文章
- 基于矩阵分解的推荐算法
- 《系统集成项目管理工程师》必背100个知识点-58沟通方式
- iOS之深入解析事件传递的响应链
- 十分钟搞懂什么是CGI
- linux搭建hdfs
- keras 自定义层input_从4个方面介绍Keras和Pytorch,并给你选择其中一个学习库的理由...
- java应该怎么学习?
- LeetCode刷题——整数反转
- Win10最详细tensorflow-GPU环境的安装(安装anaconda、CUDA、CUDANN)
- Window 2008 server DNS 无法解析ISA WPAD
- Win10 WSL adb使用
- 湖南大学操作系统期末考试之英文PPT复习提纲
- windows如何离线打补丁安全需知
- 基于arduino的WiFi无线传输
- 超分算法在 WebRTC 高清视频传输弱网优化中的应用
- 《android开发艺术探索》笔记:Activity界面跳转到透明主题界面,不调用onStop()方法
- MySQL的一级索引和二级索引
- 最简单三级管振荡分析(自由多谐振荡器电路)
- 古代汉语王力版复习重点要点
- 1-18 Collections工具类和StreamAPI流式编程