php8.0到php8.1增加了不少新特性,大部分只是做了小的一些调整,接下来我们将会学习在项目中经常用到或者说比较具有意义的新特性。
一、枚举
枚举可以算得上是“千呼万唤始出来”,在这之前我们可以看到很多php程序员在社区、论坛这些地方表达了对枚举的渴望,希望有一天php能引入枚举类型。那枚举是什么?它的意义以及应用场景又是什么?
在 PHP 中, 枚举是一种特殊类型的对象。Enum 本身是一个类(Class), 它的各种条目(case)是这个类的单例对象 。 枚举有两种类型:纯粹枚举和回退枚举,接下来使用两个案例说明一下它们的区别以及应用场景。
纯粹枚举
<?php
//定义了一个颜色枚举,分别红色、蓝色、黑色三个有效值(单例对象也可以)
enum Color
{
case red;
case blue;
case black;
}
class people
{
public function pickColor(Color $color)
{
var_dump($color);
var_dump($color->name);
}
}
//调用方法
(new people())->pickColor(Color::red);
(new people())->pickColor('red');//这里会报错:Fatal error: Uncaught TypeError:
//people::pickColor(): Argument #1 ($color) must be of type Color, string given
//打印的结果
enum(Color::red)
string(3) "red"
仅包含纯粹 case 的枚举被称为纯粹枚举,即没有与具体值关联。同时我们也可以看到每个case其实对应的是枚举对象,需要通过name属性才能获取实例名称。当方法定义的参数为枚举对象时,不能传入其他值,这样可以统一在枚举中维护,提高代码质量。
应用场景:如果不需要与具体值相关联时选用,它会使得常量更加语义化。
回退枚举
<?php
//回退枚举类
enum Color : string
{
case red = 'this is red';
case blue = 'this is blue';
case black = 'this is black';
}
//定义了一个people类
class people
{
public function pickColor(Color $color)
{
var_dump($color);
var_dump($color->name);
var_dump($color->value);
}
}
(new people())->pickColor(Color::red);
//打印结果
enum(Color::red)
string(3) "red"
string(11) "this is red"
回退枚举具有标量,这个标量可以是int|string类型中的一种,它还有一个只读的属性value,也就是定义时的值。如果需要与具体值相关联时则选用回退枚举。
二、readonly属性
使用 readonly
修饰符声明属性,防止初始化后修改属性。我们在某些类的属性时希望是只读而不能修改的,那么就可以使用 readonly
修饰。
<?php
class people
{
public readonly string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
$obj = new people('zhangsan');
var_dump($obj->name);//读取正常:string(8) "zhangsan"
//修改时报错
$obj->name = 'lisi';
//Error: Cannot modify readonly property people::$name
三、纤程(Fiber)
fiber是一种轻量级的线程或协程,可以随时挂起、恢复执行。它可以结合异步I/O库(swoole、ReactPHP等)实现协程化的异步编程,提高系统并发性能。接下来我们通过一个简答的案例来加深我们对fiber的理解。
<?php
//创建fiber实例
$fiber = new Fiber(function ($time) {
echo 'fiber启动中,时间是:'.$time . PHP_EOL;
$value = Fiber::suspend('fiber暂停了');
echo "fiber重新启动了,传过来的值是:". $value . PHP_EOL;
});
$res = $fiber->start(date("Y-m-d H:i:s"));
echo "fiber暂定的返回值是:" . $res . PHP_EOL;
//使用值的方式恢复fiber
$fiber->resume('test');
输出结果:
fiber启动中,时间是:2025-01-09 10:12:48
fiber暂定的返回值是:fiber暂停了
fiber重新启动了,传过来的值是:test