php isset PHP 8的新功能展望:JIT以及其他

php isset PHP 8的新功能展望:JIT以及其他

基本PHP执行过程的直观表示如下:

那么,如何让PHP执行的更快?JIT执行过程中有哪些变化?

扩展

由于PHP是一种解释型语言,当运行PHP脚本时,解释器将在每次请求时都会重复地解析,编译和执行代码的过程。这会导致CPU浪费和其他资源耗费,让执行时间增加。

“通过将预编译的脚本字节码存储在共享内存中来提高PHP性能,从而消除了PHP在每个请求上加载和解析脚本的需要。”

启用后,PHP解释器仅在脚本首次运行时才进行4个阶段的过程。由于PHP字节码存储在共享内存中,因此可以作为低级中间表示形式缓存(OP)来被重复使用,可以立即在Zend VM上执行。

从PHP 5.5开始,Zend 扩展在默认情况下启动,可以通过可以()在Zend 来查看配置情况。

预加载()

预加载是PHP 7.4新增的新功能。预加载提供了一种”在运行任何应用程序代码之前”将指定的脚本集存储到内存中的方法,但是对于典型的基于Web的应用程序而言,它不会带来明显的性能提升。

JIT —及时编译器

即使操作码采用低级中间表示码形式,仍然需要将其编译为机器代码。JIT”不引入任何其他IR(中间表示)形式”,使用(用于代码生成引擎的动态汇编程序)直接从PHP字节码生成本机代码。

简而言之,JIT将中间码的热门部分转换为机器代码。绕过编译,它将能够显著的提高性能和内存使用率。

实时Web应用的JIT

根据JIT RFC,即时编译器实现应提高PHP性能。但是,我们真的会在等现实应用中体验到这种改进吗?

早期测试表明,JIT可以使CPU密集型工作负载的运行速度大大提高,但是对等应用并不能带来显著性能提高。

启用JIT后,代码将不会由Zend VM运行,而是由CPU本身运行,这将提高计算速度。诸如之类的Web应用程序还依赖于TTFB,数据库优化,HTTP请求等其他因素。

因此,当涉及到和类似的应用程序时,不应该期望PHP的执行速度会大大提高。但是,JIT可以为开发人员带来一些好处。

数字代码的性能明显更好。

“典型” PHP Web应用程序代码的性能略好。

将更多代码从C转移到PHP的潜力,因为PHP现在已经足够快了。”

因此,尽管JIT几乎不会给性能带来巨大的改善,但它将把PHP升级到一个新的水平,从而使它成为一种可以直接编写许多功能的语言。

不过,JIT的引入将会导致更大的复杂性,它可能导致维护,稳定性和调试成本增加。

PHP 8改进和新功能

除了JIT之外,还值得期望的PHP 8新功能和改进还有很多,它们将使PHP更加可靠和高效。

构造器属性增强

关于如何改进PHP中的对象人体工程学的持续讨论的结果是,构造器属性增强RFC提出了一种新的,更简洁的语法,该语法将简化属性声明,使其更短,更少冗余。

该提议仅与提升的参数有关,即以,和可见性关键字为前缀的那些方法参数。

目前所有属性必须重复几次(至少四次),然后才能将其与对象一起使用。下面是一个RFC的示例:

class Point {

int $x;

int $y;

int $z;

(

int $x = 0,

int $y = 0,

int $z = 0,

) {

$this->x = $x;

$this->y = $y;

$this->z = $z;

从PHP 8开始,将有一种更有用的声明参数的方法,上述代码可以简单写为:

class Point {

(

int $x = 0,

int $y = 0,

int $z = 0,

) {}

对比可以看出,新的属性语法更易读且不易出错。

抽象Trait方法验证

Trait是一种在单一继承语言中代码重用的机制。通常,它们用于声明可在多个类中使用的方法。

特征也可以包含抽象方法。这些方法只是声明方法的签名,但是方法的实现必须使用trait在类中完成。

trait T {

test(int $x);

class C {

use T;

test( $x) {}

如果实现方法与抽象特征方法不兼容,将会抛出致命错误:

Fatal error: of C::test( $x) must be with T::test(int $x) in /path/to/your/test.php on line 10

不兼容的方法签名

在PHP中,由于方法签名不兼容而导致的继承错误会引发致命错误或警告,具体取决于导致错误的原因。

如果类正在实现接口,则不兼容的方法签名将引发致命错误。根据对象接口文档:

实现接口的类必须使用与LSP(替换原理)兼容的方法签名。不这样做将导致致命错误。下面是一个带接口的继承错误的示例:

I {

(array $a);

class C I {

(int $a) {}

在PHP 7.4中,上面的代码将引发以下错误:

Fatal error: of C::(int $a) must be with I::(array $a) in /path/to/your/test.php on line 7

子类中具有不兼容签名的函数将引发警告。

class C1 {

(array $a) {}

class C2 C1 {

(int $a) {}

在PHP 7.4中,上面的代码只会发出警告:

: of C2::(int $a) be with C1::(array $a) in /path/to/your/test.php on line 7

在PHP 8,都会抛出致命错误。

Fatal error: of C2::(int $a) must be with C1::(array $a) in /path/to/your/test.php on line 7

数组索引支持负数

在PHP中,如果数组以负索引( < 0)开头,则以下索引自动从0开始。看下面的例子:

$a = (-5, 4, true);

($a);

在PHP 7.4中,结果如下:

array(4) {

=>

bool(true)

=>

bool(true)

=>

bool(true)

=>

bool(true)

在PHP 8中,上面的代码将结果如下:

array(4) {

=>

bool(true)

=>

bool(true)

=>

bool(true)

=>

bool(true)

联合类型2.0

联合类型接受可以是不同类型的值。目前,PHP不支持联合类型,但?Type语法和特殊类型除外。

在PHP 8之前,联合类型只能在批注中指定:

class {

/**

* @var int|float $

*/

$;

/**

* @param int|float $

*/

($) {

$this-> = $;

/**

* @ int|float

*/

() {

$this->;

根据联合类型2.0 RFC提议在函数签名中添加对联合类型的支持php isset PHP 8的新功能展望:JIT以及其他,这样我们就不再依赖内联文档,而是使用T1|T2|…语法来定义联合类型:

class {

int|float $;

(int|float $): void {

$this-> = $;

(): int|float {

$this->;

联合类型支持所有可用类型,但有一些限制:

void类型不能是并集的一部分,因为void意味着函数不返回任何值。

null类型仅支持union的类型php isset,但它的使用作为一个独立的类型是不允许的。

(?T)也可以使用可为null的类型表示法,表示T|null,但不允许在联合类型中包含该表示法(不允许使用?T1|T2,应该用T1|T2|null改用)。

尽可能多的功能(即(),(),()等等)包括false可能的返回类型中,false伪类型也支持。

内部函数的一致类型错误

传递非法类型的参数时,内部函数和用户定义函数的行为会有所不同。

用户定义的函数会引发,但是内部函数会根据多种情况以多种方式运行。无论如何php isset,典型的行为是发出警告并返回null。比如下面的代码在PHP 7.4会导致告警

((new ));

: () 1 to be , given in /path/to/your/test.php on line 4

NULL

如果启用,或参数信息指定类型,则行为将有所不同。在这种情况下,将检测到类型错误并导致。

为了消除这些不一致之处,RFC建议使内部参数解析API在参数类型不匹配的情况下抛出。

在PHP 8中,上面的代码将抛出致命错误:

Fatal error: : (): #1 ($str) must be of type , given in /path/to/your/test.php:4

Stack trace:

#0 {main}

in /path/to/your/test.php on line 4

抛出表表达式

在PHP中,throw是一个语句,因此无法在只允许使用表达式的地方使用它。

建议将throw语句转换为表达式,这样就可以在允许表达式的任何上下文中使用它。例如,箭头符号,空合并运算符,三元判断和合并运算符等:

$ = fn() => throw new ();

// $value is non-.

$value = $ ?? throw new tion();

// $value is .

$value = $ ?: throw new tion();

是弱引用键的数据(对象)的集合,这意味着不会阻止对它们的垃圾回收。

PHP 7.4添加了对弱引用的支持,以此作为保留对对象的引用的一种方式,这种引用不会阻止对象本身被破坏。

在长时间运行的进程中,这将防止内存泄漏并提高性能。:

$map = new ;

$obj = new ;

$map = 42;

($map);

使用PHP 8,上面的代码执行结果如下:

()#1 (1) {

=>

array(2) {

=>

()#2 (0) {

=>

int(42)

如果取消设置对象,则键会自动从弱Map中删除:

unset($obj);

($map);

现在的结果如下:

()#1 (0) {

参数列表中的尾部逗号

尾随逗号是附加到不同上下文中的项目列表的逗号。PHP 7.2在列表语法中引入了结尾逗号,PHP 7.3在函数调用中引入了结尾逗号。

PHP 8现在在参数列表中以函数,方法和闭包形式引入尾部逗号,如以下示例所示:

class Foo {

(

$x,

int $y,

float $z,

) {

// do

在对象上允许:: class语法

为了获取类的名称,可以使用FooBar::class语法。建议将相同的语法扩展到对象,以便现在可以获取给定对象的类的名称,如下例所示:

$ = new ;

($::class); // “”

$ = null;

($::class); //

使用PHP 8,$::class提供与相同的结果($)。如果$不是对象,则抛出异常。

属性v2

属性,也称为注释,是结构化元数据的一种形式,可用于指定对象,元素或文件的属性。

在PHP 7.4之前,文档注释是将元数据添加到类,函数等的声明中的唯一方法。 v2 RFC引入了PHP属性,这些属性将它们定义为结构化的语法元数据的形式,可以将其添加到类,属性,函数php isset PHP 8的新功能展望:JIT以及其他,方法,参数和常量。

将属性添加到它们所引用的声明之前。示例:

class Foo

const FOO = 'foo';

$x;

foo( $bar) { }

$ = new class () { };

f1() { }

$f2 = () { };

$f3 = fn () => 1;

可以在文档块注释之前或之后添加属性:

/** */

foo() {}

每个声明可以具有一个或多个属性,并且每个属性可以具有一个或多个关联值:

foo() {}

新的PHP函数

PHP 8为该语言带来了几个新功能,,(),()和

在PHP 8之前,和是开发人员在给定字符串中搜索针的典型选择。问题是,这两个函数并不是很直观,它们的用法可能会使新人员感到困惑。

$ = ' ';

$ = '';

$pos = ($, $);

if ($pos !== false) {

echo “The has been found”;

} else {

echo ” not found”;

在上面的示例中,使用了!==比较运算符,该运算符还检查两个值是否属于同一类型。如果针的位置为0,这可以防止我们出错:

“此函数可能返回布尔FALSEphp isset,但也可能返回非布尔值,其值为FALSE。使用===运算符测试此函数的返回值。”

此外,一些框架提供了帮助程序功能来搜索给定字符串内的值(比如)。

RFC建议引入一个新功能,该功能允许在字符串内部进行搜索:。

( $ , $ ) : bool

它的用法非常简单。检查是否$在中找到$并返回true或false相应地返回。使用可以使用如下语法:

$ = ' ';

$ = '';

if (($, $)) {

echo “The has been found”;

} else {

echo ” not found”;

这更易读,更不容易出错。目前它区分大小写,但是将来可能会改变。

()和()

除此功能外,还有两个新功能允许在给定的规则搜索:和。检查给定字符串是否以另一个字符串开头或结尾:

( $ , $) : bool

( $ , $) : bool

如果$大于$,则两个函数都将返回false。这两个函数都区分大小写:

$str = “”;

if (($str, “Word”)) echo “Found!”;

if (($str, “word”)) echo “Not found!”;

是一个新的PHP函数,它返回变量的类型。新函数的工作方式与函数非常相似,但是返回本机类型名称并解析类名称。对于语言来说,这是一个很好的改进,()对类型检查没有用。

RFC提供了两个有用的示例,可以更好地理解新()功能和的区别()。第一个示例显示了工作方式:

$bar = ;

if (!($bar Foo)) {

throw new (' ' . Foo::class . ', got ' . (($bar) ? ($bar) : ($bar)));

在PHP 8中,可以使用,而不是:

if (!($bar Foo)) {

throw new (' ' . Foo::class . ' got ' . ($bar));

下面显示了和的返回值对比:

总结

在本文中,我们介绍了PHP 8发行版中预期的所有关键更改和改进。其中最值得期待的肯定是JIT编译器,还PHP 8还有很多其他功能。希望我们能早日运行新的版本,替换到满是bug的PHP 5.2系统(群里一个PHP 5.2老内存泄露,还不敢升级的人问怎么解决,有感!)。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » php isset PHP 8的新功能展望:JIT以及其他

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们