PHP 7.4.0 发布了,此版本标志着 PHP 7 系列的第四次特性更新。

看了英文手册后,发现其进行了许多改进,并带来了一些新特性,现在将这些新特性您:

1.Typed Properties 类型属性

类属性现在支持类型声明,以下示例将强制 $User-> id 只能分配 int 值,而 $User-> name 只能分配 string 值。

<?php

class User {

    public int $id;

    public string $name;

}

?>

● 它们自PHP 7.4起可用。

● 它们只在类中可用,并且需要访问修饰符:public、protected、private、var。

● 除了void和callable之外,所有类型都是允许的。

PHP是我们喜欢和讨厌的一种动态语言,它将强制类型转换做的太好,有时也会引起反作用。假设您在期望整数的地方传递了一个字符串,PHP将尝试自动转换该字符串:

class Bar

{

    public int $i;

}

$bar = new Bar;

$bar->i = '1'; //

如果不喜欢这种行为,可以通过声明严格类型来禁用它:

declare(strict_types=1);
$bar = new Bar;

$bar->i = '1'; //

Fatal error: Uncaught TypeError: 

Typed property Bar::$i must be int, string used

2.Arrow Functions 箭头函数

箭头函数提供了用于定义具有隐式按值作用域绑定的函数的简写语法。

<?php

$factor = 10;

$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);

// $nums = array(10, 20, 30, 40);

?>

● 自PHP 7.4起可用

● 他们以fn关键字开头

● 它们只能有一个表达式,即return语句

● 不允许return关键字

● 参数和返回类型可以是类型提示

您没看错:短闭包只能有一个表达式。这意味着您不能包含多行。

理由如下:

简短闭包的目标是减少冗长。fn当然在所有情况下都比function短。然而,如果您处理的是多行函数,那么使用短闭包所获得的好处就更少。

毕竟,按照定义,多行闭包已经更加冗长;因此能够跳过两个关键字(function和return)不会有太大的区别。

3.Limited Return Type Covariance and Argument Type Contravariance 有限返回类型协变与参数类型逆变

仅当使用自动加载时,才提供完全协变/逆变支持。在单个文件中,只能使用非循环类型引用,因为所有类在被引用之前都必须可用。

<?php

class A {}

class B extends A {}

class Producer {

    public function method(): A {}

}

class ChildProducer extends Producer {

    public function method(): B {}

}

?>

4.Unpacking Inside Arrays 打包内部数组

<?php

$parts = ['apple', 'pear'];

$fruits = ['banana', 'orange', ...$parts, 'watermelon'];

// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

?>

5.Numeric Literal Separator 数值文字分隔符

数字文字可以在数字之间包含下划线。

<?php

6.674_083e-11; // float

299_792_458;   // decimal

0xCAFE_F00D;   // hexadecimal

0b0101_1111;   // binary

?>

限制

唯一的限制是数字文字中的每个下划线必须直接位于两个数字之间。这条规则意味着下面的用法都不是有效的数字文字:

_100; 

100_;       

1__1;       

1_.0; 1._0; 

0x_123;     

0b_101;     

1_e2; 1e_2; 

PHP功能不受影响

在数字文字的数字之间添加下划线不会改变其值。下划线在词法分析阶段被删除,因此运行时不受影响。

var_dump(1_000_000); // int(1000000)

6.Weak References 弱引用

弱引用可以保留对对象的引用,不会阻止对象被销毁。

弱引用允许保留对对象的引用,而该对象不会阻止对象被销毁;它们对于实现类似缓存的结构非常有用。

原则上,弱引用对象并不复杂,只需要(ab)使用Zend或下面的层,因为我们不直接支持它。

final class WeakReference {

    public static function create(object $object) : WeakReference;

    public function get() : ?object;

}

7.Allow Exceptions from __toString() 允许从 __toString() 抛出异常

现在允许从 __toString() 引发异常,以往这会导致致命错误,字符串转换中现有的可恢复致命错误已转换为 Error 异常。

7.4以前禁止从__toString()抛出异常,如果__toString()异常,将导致致命错误。

从技术角度来看,这种限制最终是无效的,因为字符串转换期间的异常仍然可以由将可恢复错误转换为异常的错误处理程序触发:

set_error_handler(function() {

    throw new Exception();

});

try {

    (string) new stdClass;

} catch (Exception $e) {

    echo "(string) threw an exception...\n";

}

另外,将“不能转换为字符串”和“__toString()必须返回一个字符串值”可恢复的致命错误转换为正确的错误异常,这与PHP 7中建立的错误策略一致。

8.Opcache Preloading Opcache 预加载

新增 Opcache 预加载支持。

在PHP 7.4中,添加了对预加载的支持,这是一个可以显著提高代码性能的特性。

简而言之,这是它的工作方式:

● 为了预加载文件,您需要编写一个自定义PHP脚本

● 该脚本在服务器启动时执行一次

● 所有预加载的文件在内存中都可用于所有请求

● 在重新启动服务器之前,对预加载文件所做的更改不会产生任何影响

虽然预加载是建立在opcache之上的,但它并不是完全一样的。Opcache将获取您的PHP源文件,将其编译为“ opcodes”,然后将这些编译后的文件存储在磁盘上

您可以将操作码看作是代码的底层表示,在运行时很容易解释。因此,opcache会跳过源文件和PHP解释器在运行时实际需要之间的转换步骤。巨大的胜利!

但我们还有更多的收获。Opcached文件不知道其他文件。如果类A是从类B扩展而来的,那么仍然需要在运行时将它们链接在一起。此外,opcache执行检查以查看源文件是否被修改,并将基于此使其缓存失效。

因此,这就是预加载发挥作用的地方:它不仅将源文件编译为操作码,而且还将相关的类、特征和接口链接在一起。然后,它将这个“已编译”的可运行代码blob(即:PHP解释器可以使用的代码)保存在内存中

现在,当请求到达服务器时,它可以使用已经加载到内存中的部分代码库,而不会产生任何开销。

为了进行预加载,开发人员必须告知服务器要加载哪些文件。这是用一个简单的PHP脚本完成的,确实没有什么困难。

规则很简单:

● 您提供一个预加载脚本,并使用opcache.preload命令将其链接到您的php.ini文件中。

● 您要预加载的每个PHP文件都应该传递到opcache_compile_file(),或者在预加载脚本中只需要一次。

假设您想要预加载一个框架,例如Laravel。您的脚本必须遍历vendor/laravel目录中的所有PHP文件,并将它们一个接一个地添加。

在php.ini中:

opcache.preload=/path/to/project/preload.php

这是一个虚拟的实现:

$files = /* 要预加载的文件数组 */;

foreach ($files as $file) {

    opcache_compile_file($file);

}

有一个警告!为了预加载文件,还必须预加载它们的依赖项(接口,特征和父类)

如果类依赖项有任何问题,则会在服务器启动时通知您:

Can't preload unlinked class

Illuminate\Database\Query\JoinClause: 

Unknown parent 

Illuminate\Database\Query\Builder

这不是一个致命的问题,您的服务器可以正常工作。但你不会得到所有你想要的预加载文件。

幸运的是,还有一种确保链接文件也被加载的方法:您可以使用require_once代替opcache_compile_file,让已注册的autoloader(可能是composer的)负责其余的工作。

$files = /* 要预加载的文件数组 */;

foreach ($files as $file) {

    require_once($file);

}

还有一些需要注意的地方。例如,如果您试图预加载Laravel,那么框架中的一些类依赖于其他尚不存在的类。例如,文件系统缓存类\ lighting \ filesystem \ cache依赖于\League\Flysystem\Cached\Storage\AbstractCache,如果您从未使用过文件系统缓存,则可能无法将其安装到您的项目中。

#有效吗?

这当然是最重要的问题:所有文件都正确加载了吗?您可以简单地通过重新启动服务器来测试它,然后将opcache_get_status()的输出转储到PHP脚本中。您将看到它有一个名为preload_statistics的键,它将列出所有预加载的函数、类和脚本;以及预加载文件消耗的内存。

#性能

现在到最重要的问题:预加载真的能提高性能吗?

答案是肯定的:我进行了一些基准测试。

有趣的是,您可以决定仅预加载代码库中经常使用的类。基准测试显示,只加载大约100个热门类,实际上可以获得比预加载所有类更好的性能收益。预加载全部类,性能提升13%,而预加载热门类,则提升有17%。

当然,应该预加载哪些类取决于您的项目。明智的做法是在开始时尽可能多地预加载。

此外还有一些弃用,以及从核心中删除一些扩展,详情查看英文原版手册:

https://www.php.net/manual/zh/migration74.new-features.php

PHP 7.4.0发布!一起看看有哪些新特性的更多相关文章

  1. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

  2. Android N(7.0) 被美翻的新特性!

    Tamic 专注移动开发!更多文章请关注 Csdn: http://blog.csdn.net/sk719887916/article/details/52612444 $ http://www.ji ...

  3. ASP.NET Core 2.0 Preview 1 中贴心的新特性

    西雅图时间5月10日,微软在 Build 2017 大会上发布了 ASP.NET Core 2.0 Preview 1 ( 详见 Announcing ASP.NET 2.0.0-Preview1 a ...

  4. Spring Boot 2.2.2 发布,新增 2 个新特性!

    Spring Boot 2.2.2 发布咯! Spring Boot 2.2.1 发布,一个有点坑的版本! 2.2.1 发布没过一个月,2.2.2 就来了. Maven依赖给大家奉上: <dep ...

  5. FineUI(专业版)v2.6.0即将支持的两个新特性!

    特性1:以一挡三,将 160 行代码缩减为 60 行的技巧! 为了更新单元格的编辑值,我们需要下面三个函数同时上阵: GetModifiedDict:修改的单元格值 GetDeletedList:删除 ...

  6. Java SE 5.0(JDK 1.5)新特性

    目录 自动装箱与拆箱 枚举(常用来设计单例模式) 静态导入static import 可变参数(Varargs) 内省(Introspector) 泛型(Generics) For-Each循环 ja ...

  7. iOS开发——新特性OC篇&Swift 2.0新特性

    Swift 2.0新特性     转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...

  8. C# 8.0的三个令人兴奋的新特性

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新.同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高 ...

  9. C# 8.0的三个值得关注的新特性

    本文翻译自:https://dzone.com/articles/3-new-c-8-features-we-are-excited-about 转载请注明出自:葡萄城官网,葡萄城为开发者提供专业的开 ...

  10. 来,看看MySQL 5.6, 5.7, 8.0的新特性

    对于MySQL的历史,相信很多人早已耳熟能详,这里就不要赘述.下面仅从产品特性的角度梳理其发展过程中的里程碑事件. 1995年,MySQL 1.0发布,仅供内部使用. 1996年,MySQL 3.11 ...

随机推荐

  1. pat 1149 Dangerous Goods Packaging(25 分)

    1149 Dangerous Goods Packaging(25 分) When shipping goods with containers, we have to be careful not ...

  2. pat 1124 Raffle for Weibo Followers(20 分)

    1124 Raffle for Weibo Followers(20 分) John got a full mark on PAT. He was so happy that he decided t ...

  3. React入门知识点清单

    做前端的一定都知道现在是三大框架--Vue.React.Angular三足鼎立的时代.Vue是公认的最容易入门的,因为它文件结构上有传统的HTML的影子,让刚接触它的前端人员刚到很"亲切&q ...

  4. 文件系统类型(ext4、xfs、fat32、vfat、ntfs、....)

    Linux 1.Linux:存在几十个文件系统类型:ext2,ext3,ext4,xfs,brtfs,zfs(man 5 fs可以取得全部文件系统的介绍) 不同文件系统采用不同的方法来管理磁盘空间,各 ...

  5. PowerMock学习(五)之Verifying的使用

    前言 Verifying是一个非常强大的测试工具,在mock系列框架中使用广泛,主要用于验证方法是否被调用,下面将举例说明. 场景 模拟这样一个场景,通过Dao查询学生,如果存在更新原来学生,不存在则 ...

  6. 【论文阅读】Deep Clustering for Unsupervised Learning of Visual Features

    文章:Deep Clustering for Unsupervised Learning of Visual Features 作者:Mathilde Caron, Piotr Bojanowski, ...

  7. 面试官:CPU百分百!给你一分钟,怎么排查?有几种方法?

    Part0 遇到了故障怎么办? 在生产上,我们会遇到各种各样的故障,遇到了故障怎么办? 不要慌,只有冷静才是解决故障的利器. 下面以一个例子为例,在生产中碰到了CPU 100%的问题怎么办? 在生产中 ...

  8. BeanUtils.copyProperties()怎样去掉字段首尾的空格

    背景 下午三时许,笔者正戴着耳机听着歌开心的敲着bug,忽然听到办公室的吵架声,原来是ios开发和产品小姐姐吵起来了,为了一个车牌号的校验问题.起因是ios传的车牌号没有将字符串的首尾空格去掉,后端直 ...

  9. 使用FastReport报表工具生成图片格式文档

    之前我在随笔<使用FastReport报表工具生成报表PDF文档>介绍过使用FastReport.Net来根据报表模板进行生成PDF,以及随笔<使用FastReport报表工具生成标 ...

  10. PHP安装扩展补充说明

    上一篇文章中用到了,php的sodium扩展,那么如何安装PHP扩展呢?基于我之前踩过的一些坑,大致整理了几种安装php扩展的方法.已安装sodium为例 1.先做点准备工作,安装sodium依赖 r ...