PHP8新特性示例
新增命名参数功能
命名参数 :就是具名参数,在调用函数的时候,可以指定参数名称,指定参数名称后,参数顺序可以不安装原函数参数顺序传
示例: <?php // 计算余额方法 function balance($amount, $payment) { return $amount - $payment; } //传统方式调用 balance(100, 20); //php8 使用命名参数调用 balance(amount: 100, payment: 20); //也可以换个顺序,这样来 balance(payment: 20, amount: 100);注解功能
注解 :注解可以将类定义成一个一个低耦合,高内聚的元数据类。在使用的时候通过注解灵活引入,反射注解类实例的时候达到调用的目的。注解类只有在被实例化的时候才会调用
示例<?php // 老写法 class User { protected string $name; protected int $age; public function __construct(string $name, int $age) { $this->name = $name; $this->age = $age; } } //新写法, class User { public function __construct( protected string $name, protected int $age ) {} }构造器属性提升
解释 :就是在构造函数中可以声明类属性的修饰词作用域,节约了代码量,不用单独声明类属性了。
示例:<?php // php8之前 class User { protected string $name; protected int $age; public function __construct(string $name, int $age) { $this->name = $name; $this->age = $age; } } //php8写法, class User { public function __construct( protected string $name, protected int $age ) {} }联合类型
解释 :在不确定参数类型的场景下,可以使用.
示例: function printSomeThing(string|int $value) { var_dump($value); }Match 表达式
解释:和 switch case 差不多,但是严格要求 === 匹配
示例:<?php $key = "b"; $str = match($key) { "a" => "this a", "c" => "this c", 0 => "this 0", "b" => "last b", }; echo $str;//输出 last b新增 Nullsafe 运算符
解释:简化了 is_null 判断
示例:<?php class User { public function __construct(private string $name) { //啥也不干 } public function getName() { return $this->name; } } //不实例 User 类,设置为null $user = null; echo $user->getName();//php8之前调用,报错 echo $user?->getName();//php8调用,不报错,返回空联合类型rfc
考虑到 PHP 动态语言类型的特性,现在很多情况下,联合类型都是很有用的。联合类型是两个或者多个类型的集合,表示可以使用其中任何一个类型。 public function foo(Foo|Bar $input): int|float;
请注意,联合类型中不包含 void ,因为 void 表示的含义是 "根本没有返回值"。 另外,可以使用 |null 或者现有的 ? 表示法来表示包含 nullable 的联合体 : public function foo(Foo|null $foo): void; public function bar(?Bar $bar): void;JITrfc
JIT — just in time — 编译器虽然不总是在 Web 请求的上下文中,但是有望显著地提高性能。目前还没有完成任何准确的基准测试,但是肯定会到来。 属性rfc
属性在其他语言中通常被称为 注解 ,提供一种在无需解析文档块的情况下将元数据添加到类中的方法。 use AppAttributesExampleAttribute; <> class Foo { <> public const FOO = "foo"; <> public $x; <> public function foo(<> $bar) { } } <> class ExampleAttribute { public $value; public function __construct($value) { $this->value = $value; } }
新增 static 返回类型 rfc
尽管已经可以返回 self,但是 static 直到 PHP 8 才是有效地返回类型 。考虑到 PHP 具有动态类型的性质,此功能对于许多开发人员将非常有用。 class Foo { public function test(): static { return new static(); } }新增mixed类型rfc
有人可能将其称为必要的邪恶: mixed 类型让许多人感觉十分混乱。然而,有一个很好的论据支持去实现它:缺少类型在 PHP 中会导致很多情况: 函数不返回任何内容或返回空值 我们需要多种类型的一种类型 我们需要的是 PHP 中不能进行类型提示的类型
因为上述原因,添加 mixed 类型是一件很棒的事儿。 mixed 本身代表下列类型中的任一类型: arrayboolcallableintfloatnullobjectresourcestring
请注意,mixed 不仅仅可以用来作为返回类型,还可以用作参数和属性类型。因为 mixed 类型已经包括了 null,因此 mixed 类型不可为空。下面的代码会触发致命错误: function bar(): ?mixed {}
已上是整理出来的新特性的变化,后续会继续整理,PHP8的发布会让PHP更上一层楼,相信PHP是世界上最好的语言!