PHP8.0、8.1、8.2、8.3的新特性有哪些?版本分别发布于什么时候
PHP 8.0
发布时间:2020年11月26日
新特性:
JIT 编译器:最引人注目的改进是 Just-In-Time (JIT) 编译器的引入。JIT 编译器可以在运行时将 PHP 代码编译成机器代码,从而提高了执行效率和性能。
联合类型:PHP 8.0 支持联合类型声明,允许函数参数、返回值和属性声明多种类型。例如,你可以使用 int|float 表示一个变量可以是整数或浮点数。
命名参数:此版本引入了命名参数,使得在调用函数时可以通过参数名指定值,而不是仅仅依赖于参数的位置。
match 表达式:这是一个比现有的 switch 语句更强大、更表达式化的结构。match 表达式可以返回值,并且自动进行严格类型比较。
构造函数属性提升:PHP 8.0 允许在构造函数中使用单一语句定义和初始化属性,使得类定义更为简洁。
空安全运算符:PHP 8.0 添加了新的空安全运算符 ?->,允许安全地在可能为 null 的对象上调用方法和访问属性。
错误处理改进:throw 现在是一个表达式而不只是一个语句,这意味着它可以在更多的上下文中使用,比如在箭头函数中。引入了新的Throwable接口来代替旧的Exception基类,提供了更灵活的错误处理方式,同时改进了异常捕获和处理的语法。
弱引用:通过 WeakMap 类的引入,PHP 8.0 支持弱引用,允许对象被垃圾收集器回收,即使它们还被 WeakMap 引用。
WeakMap 类提供了一种方式来存储对象之间的关联,而不阻止这些对象被垃圾回收器回收。这在某些情况下非常有用,特别是在处理大量对象和缓存时,可以避免内存泄漏。
示例:
假设我们有一个应用程序,其中包含用户和他们的会话数据。我们希望在内存中保持一个映射,将用户对象映射到其会话数据,但我们不希望这个映射阻止用户对象被垃圾回收。
示例代码:
class User {
public string $name;
public function __construct(string $name) {
$this->name = $name;
}
}
class SessionData {
public string $data;
public function __construct(string $data) {
$this->data = $data;
}
}
$weakMap = new WeakMap();
$user1 = new User("Alice");
$user2 = new User("Bob");
$session1 = new SessionData("Session data for Alice");
$session2 = new SessionData("Session data for Bob");
$weakMap[$user1] = $session1;
$weakMap[$user2] = $session2;
// 在这个点上,$weakMap 保存了用户到会话数据的映射。
echo $weakMap[$user1]->data; // 输出: Session data for Alice
// 假设 $user1 不再被其他地方引用
unset($user1);
// 运行垃圾回收
gc_collect_cycles();
// 由于 $user1 已经被销毁,它对应的键值对也会从 WeakMap 中自动移除
// 尝试访问已经不存在的键将会抛出一个错误
// echo $weakMap[$user1]->data; // 这将会抛出一个错误
// $user2 仍然存在,所以它的会话数据依然可以访问
echo $weakMap[$user2]->data; // 输出: Session data for Bob
属性只写一次:可以声明属性为 readonly,意味着属性一旦被初始化后就不能被修改。
PHP 8.1
发布时间:2021年11月
新特性:
增加了Enums(枚举功能)。
增加了fsync()和fdatasync()函数,用于确保数据成功写入底层存储。
引入了inheritance cache(继承缓存),减少了类继承中的开销,提升了性能。
新增对"Fibers"的支持,增加了PHP的异步功能。
支持xxHash和MurmurHash V3哈希算法。
将更多资源转化为对象,如fileinfo、GD、FTP等。
新的 array_is_list 函数:这个函数用于检查数组是否是一个列表(即数组索引是连续的整数)。
性能改进:包括 JIT(即时编译)的进一步优化和其他内部改进,这些改进使得 PHP 8.1 在某些情况下比 PHP 8.0 运行得更快。
Intersection Types:允许类型声明使用交集类型,这意味着一个值必须满足多个类型约束。
只读属性(Readonly properties):这允许在类中定义只读属性,这些属性必须在构造函数中初始化,并且之后不能被修改。
语法改进:包括新的never返回类型声明,表示函数不应返回任何值。
PHP 8.2
发布时间:2022年11月
新特性:
引入了只读类,确保类实例创建后不可修改,提高代码可靠性。
允许true、false和null作为独立类型,提升类型检查和错误捕捉的精确性。
支持DNF类型(析取范式),可以定义更复杂和精确的类型。
允许组合Union Types(联合类型)和Intersection Types(交集类型),使类型声明更灵活。
增加了新的mysqli_execute_query函数和方法,可能提供更好的性能和灵活性。
对非最优的ini配置发出警告,帮助优化应用配置。
弃用动态属性:默认情况下不再允许在标准类中动态创建属性。
PHP 8.3
发布时间:2023年3月16日
新特性:
对即时编译器(JIT)进行了进一步优化,提升了脚本执行速度和降低了CPU占用。
采用了更高效的字节码解释和执行方式,减少了脚本执行时间。
增强了内存回收效率,对内存密集型应用是显著的性能提升。
对数组处理和类型系统进行了优化。
预加载升级,允许服务器启动时加载和编译PHP代码,减少了每次请求时的编译开销。
只读常量:允许定义在编译时确定值且在运行时不可改变的常量。
改进的字符串操作能力:包括新的内置函数用于更高效地处理字符串
