全网最全的php8新特性
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最全的php8新特性相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
php8出来也已经有一段时间了,但是真正使用到项目中的公司却还不多,虽然功能新增了很多,但是因为作为最新版本的php,是不可能直接应用到项目中的,只有经过真操实弹的项目检测,才会慢慢推广迭代,但是作为最新版本的php8,它的新特性我们还是必须要知了解的,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。
目录
一、 官方网站
二、命名参数
- 官方英文:Named arguments
- 传参的时候,可以跳过可选参数,这在之前版本中不行
<?php
//php7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
//php8
htmlspecialchars($string, double_encode: false);
三、属性注解
- 官方英文:Attributes
- 可以使用PHP原生语法来使用结构化元数据,而非PHPDoc申明
<?php
//php7
class PostsController
{
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /* ... */ }
}
//php8
class PostsController
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }
}
四、构造器属性的提升
- 官方英文:Constructor property promotion
- 可以使用更简便的方法初始化属性
<?php
//php7
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
//php8
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
五、联合类型
- 官方英文:Union types
- 老版本申明类型单一,php8可以申明多种类型
<?php
//php7
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number) {
$this->number = $number;
}
}
new Number('NaN'); // Ok
//php8
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
六、match表达式
- 官方英文:Match expression
- switch表达式的简化
<?php
//php7
switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
//php8
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
七、nullsafe运算符
- 官方英文:Nullsafe operator
- 可以使用nullsafe运算符链式调用,而不需要检测null,如果其中一个不满足,直接中断并返回null
<?php
//php7
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
//php8
$country = $session?->user?->getAddress()?->country;
八、字符串数字弱类型比较优化
- 官方英文:Saner string to number comparisons
- 字符串和数字的比较更加的严格
<?php
//php7
0 == 'foobar' // true
//php8
0 == 'foobar' // false
九、函数错误一致性
- 官方英文:Consistent type errors for internal functions
- 以前错误类型会分notice、warning、error,现在大多数位TypeError
<?php
//php7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
//php8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
十、JIT优化
- 官方英文:Relative JIT contribution to PHP 8 performance
- 这个改动被鸟哥成为php8中最重要的改动,php8中引入了两个即时编译引擎,Tracing JIT在两个中潜力更大,显示了三倍的性能,某些长时间运行的程序中也显示了1.5-2倍的性能改进
十一、其他改进
- 操作符@将不再抑制fatal类型错误
- assert()不再支持执行代码,减少了安全漏洞
- create_function()函数彻底被移除
- 因为libxml的依赖最低2.9.0起,所以XXE漏洞彻底可以消失了
- Phar中元信息不再进行自动反序列化了,phar://触发反序列化的姿势也告别了
- parse_str()必须传入第二个参数了,少了一种全局变量覆盖的方法
以上是关于全网最全的php8新特性的主要内容,如果未能解决你的问题,请参考以下文章