ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php8.0正式版新特性和性能优化学习

2021-04-14 18:03:47  阅读:321  来源: 互联网

标签:obj true php8.0 JIT PHP8 正式版 PHP 优化 Opcache


前言

PHP团队宣布PHP8正式GA(链接)。php的发展又开启了新的篇章,PHP8.0.0版本引入了一些重大变更及许多新特性和性能优化机制.火速学习下~

JIT(Just in Time Compiler) 即时编译器

JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行.在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是 Zend VM,而是更为底层的 CPU.其较之前的流程改动和重点如下(来源于PHP8 JIT的主要参与者鸟哥@风雪之隅)
image
左图是PHP8之前的Opcache流程示意图, 右图是PHP8中的Opcache示意图, 可以看出几个关键点:

  • Opcache会做opcode层面的优化,比如图中的俩条opcode合并为一条
  • PHP8的JIT目前是在Opcache之中提供的
  • JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码
  • JIT不是原来Opcache优化的替代,是增强
  • 目前PHP8只支持x86架构的CPU

match表达式

match是PHP8中新增的关键字(即无法再做类名),其作用与switch有点相似,用于变量的值转换与赋值,使用如下

$input = true; $result = match($input) { "true",true => 1, //可多值匹配,匹配方式为===,无匹配值会抛出Fatal error "false" => 0, "null" => NULL, }; var_dump($result); //输出: int(1)

Attributes(注解)

Attributes即注解,它提供了一种向类添加元数据的方法,无需解析文档块.符号为#[],使用格式为#[param('value1','value2')],可定义多个也可写成数组形式

#[ param('value1','value2'), param2('value3','value4'), ]

且两种形式可混合使用,如下

#[Url1("https://www.zhuyilong.fun")] #[Params1("name1", "age1")] #[ Params2("name2", "age2"), Url2("https://www.zhuyilong.xn--6qq986b3xl/") ] function newAttributes($arg = ''){} $obj = new ReflectionFunction('newAttributes'); $attributes = $obj->getAttributes(); echo'<pre>'; echo($attributes[1]->getName().'<br>'); print_r($attributes[2]->getArguments());

输出为

Params1 Array ( [0] => name2 [1] => age2 )

联合类型Union Types

Union Types 支持声明并接收多个不同类型的值,它是两种或多种类型的集合,使用时可以选择其一

function getParam(string|array|bool $p) { var_dump($p); } getParam(true);//输出: bool(true)

static 返回类型

虽然已经可以返回 self,但是考虑到 PHP 具有动态类型的性质,PHP 8 中支持 static 返回类型将更加高效

class Test { public $_name = 'test'; public function getStatic(): static { return new static(); } } $obj = new Test(); var_dump($obj->getStatic()->_name); //输出: string(4) "test"

弱映射WeakMap

WeakMap弱映射的一般用例是将数据与单个对象实例关联起来,而不强制它们保持活动状态,从而在长时间运行的进程中有效地泄漏内存。例如,可以使用弱映射来记录计算结果

class FooBar { private WeakMap $cache; public function getSomethingWithCaching(object $obj) { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } // ... }

如上代码所示,每个对象都只会调用一次computeSomethingExpensive方法,同时,如果对象被销毁,它也会从映射中删除缓存值.

标签:obj,true,php8.0,JIT,PHP8,正式版,PHP,优化,Opcache
来源: https://www.cnblogs.com/endkoo/p/14659126.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有