查看原文
其他

PHP8中都在增加什么有趣的新特性?

21CTO 21CTO 2022-05-25

读:PHP8会让我们写代码的方式焕然一新。

各位广大干部农工同志们,PHP8的正式版本将于2020年11月26日正式发布,届时它的全部闪光特性都将稳定地并全部可用。


本文撰写在PHP8 时仍处 Alpha阶段,这表示后面仍然会有功能更新。以下是我总结的新功能概要,来瞧瞧这些功能对开发者来说意味着啥。


一 属性


毫无疑问,属性是PHP语言的最大补充。


属性有助于将元数据添加到函数、参数、类、方法、常量、属性等。这些东西在之前是通过docblock模拟的,然后通过其它地方来解析。


如今,属性可是PHP中的一等公民,并且可以通过编程进行访问。


请看如下代码:


@@Route(Http::POST, '/store/123/item')
class ItemCreateHandler{
public function __invoke() {
// ...
}
}


目前,PHP的属性之概念仍然不断进化,虽然已经定下从<<FooAttribute到@@FooAttribute,但是资深开发者 Derick Rethans 在Twitter上用一个简单的“我们真的接受这样的属性写法吗?”他表示强烈质疑属性的符号定义。


他说本人更喜欢Rust的方法: #[FooAttribute]



Derick说的的确如此,社区也表示认可。这表明属性在功能冻结期间仍然有可能会更新RFC。不论哪种方式,我们都不能否认属性是PHP开发者们欢迎的功能。


面向对象更新


现在我们经常写构造方法,代码是这样式儿写的:


class Response {
private int $code;
private string $body;
private array $headers;


public function __construct(int $code, string $body, array $headers) {
$this->code = $code;
$this->body = $body;
$this->headers = $headers;
}
}


人们也习以为常,习惯了如此方式。而在PHP8中,可以这样简写:


class Response {
public function __construct(
private int $code,
private string $body,
private array $headers,
) {}
}

是不是变得更整齐了?


match表达式


你可能以前也写过很复杂的Switch语句和表达式,比如下面这样的代码:


switch ($x) {
case 1:
$y = 3;
break;
case 2:
$y = 4
break;
case 3: case 4:
$y = 5;
break;
...
default:
throw new \RuntimeException('Not happening, bud');
}


还是有点太长了。现在,人们可以用更简短的match表达式:、


$y = match ($x) {
1 => 3,
2 => 4,
3, 4 => 5,
...
default => throw new \RuntimeException('Not happening, bud'),
}

match表达式可能是受到ES6的启发,让每个匹配的案例仅包含一个表达式,同时也包含一个隐式的break表达式。


联合类型


PHP是一个动态类型语言。使用联合类型将可为参数或返回值类型指定2个或更多可接受的类型。


目前PHP支持两种特殊联合类型,Type/null以及array/Traversable。


现在我们来代替phpdoc处理类型,使用如下代码:


class Number {
private int|float $number;


public function setNumber(int|float $number): void {
$this->number = $number;
}


public function getNumber(): int|float {
return $this->number;
}
}

也可以使用null:


public function handle(Product|null $product): int
// equals
public function handle(?Product $product): int



命名参数


命名参数允许基于参数名称,而不再是基于参数位置来将值传递给参数。如下代码示例:


// Positional arguments
json_encode($data, 0, 512);


// Named arguments
json_encode(value: $data, options: 0, depth: 512);


开发者可以选择自己喜欢的任一种。


小结


直到今,PHP8 仍然在更新中,社区也欢迎更多的改良意见。可以预见的是,新版本的PHP将会让我们写PHP代码的方式焕然一新!


作者:洛逸

来源:21CTO


推荐阅读:


微软停止支持 PHP 8.0、PHP宇宙最强怎么办?

Nginx为什么快到根本停不下来?

每秒570000的写入,MySQL如何实现?


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存