类的属性中现在支持添加指定的类型。
<?php
class User {
public int $id;
public string $name;
}
?>
$user->id
只能为 int
类型,同时 $user->name
只能为 string 类型。
箭头函数提供了一种更简洁的定义函数的方法。
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>
以下代码现在可以正常执行:
<?php
class A {}
class B extends A {}
class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
?>
<?php
$array['key'] ??= computeDefault();
// 等同于以下旧写法
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>
<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>
数字文字可以在数字之间包含下划线。
<?php
6.674_083e-11; // float
299_792_458; // decimal
0xCAFE_F00D; // hexadecimal
0b0101_1111; // binary
?>
弱引用允许程序员保留对对象的引用,但不会阻止销毁对象。
现在允许从 __toString() 抛出异常。之前的版本,将会导致致命错误。新版本中,之前发生致命错误的代码,已经被转换为 Error 异常。
如果扩展是使用 libcurl >= 7.56.0 构建的,CURLFile 现在除了支持普通文件名之外还支持流封装协议。
FILTER_VALIDATE_FLOAT
过滤器现在支持 min_range
和 max_range
选项,其含义跟 FILTER_VALIDATE_INT
相同。
FFI 是新扩展,提供了简单的方式去 C 库中调用原生函数、访问原生变量和创建和访问定义的数据结构。
添加 IMG_FILTER_SCATTER
图片过滤器以将分散过滤器(scatter filter)应用于图片。
使用循环卷积多项式新增 crc32c
散列。此 CRC32 变体用于 iSCSI、SCTP、Btrfs 和 ext4 等存储系统。
新增 mb_str_split() 函数,提供了跟 str_split() 相同的行为,但是在码点上操作,而不是字节。
新增缓存预加载特性。
preg_replace_callback() 和 preg_replace_callback_array()
函数现在接受附加的 flags
参数,支持 PREG_OFFSET_CAPTURE
和 PREG_UNMATCHED_AS_NULL
flag。这会影响传递给回调函数的匹配数组的格式。
现在可以将用户名和密码指定为 mysql、mssql、sybase、dblib、firebird 和 oci 驱动程序的 PDO DSN 的一部分。之前仅支持 pgsql 驱动程序。如果在构造方法和 DSN 中都指定了,则优先使用构造方法中的用户名/密码。
现在可以在 SQL 查询中转义问号,以避免解释为参数占位符。编写 ??
将会向数据库发送一个问号,例如使用 PostgreSQL JSON
键中存在(?
)运算符。
PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)
允许检查语句是否只读,例如它是否修改数据库。
PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)
允许在 PDO::errorInfo() 和 PDOStatement::errorInfo()
中使用 SQLite3 扩展结果代码。
新增 SQLite3::lastExtendedErrorCode() 用于获取最后的扩展结果代码(extended result code)。
新增 SQLite3::enableExtendedResultCodes($enable = true)
,用于 SQLite3::lastErrorCode() 返回扩展结果代码。
strip_tags() 现在接受允许的标签数组:现在可以编写
strip_tags($str, ['a', 'p'])
代替
strip_tags($str, '<a><p>')
。
新增自定义对象序列化的新机制,使用两种新魔术方法:__serialize
和 __unserialize
。
<?php
// 返回数组,包含对象所有必要的状态。
public function __serialize(): array;
// 从指定的数据数组中回复对象状态。
public function __unserialize(array $data): void;
?>
现在可以不带任何参数调用 array_merge() 和
array_merge_recursive(),此时会返回空数组。这跟展开运算符结合非常有用,比如
array_merge(...$arrays)
。
proc_open() 现在接受数组而不是命令字符串。在这种情况下,会直接打开进程(无需通过 shell),PHP 将会负责任何必要的参数转义。
<?php
proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>
proc_open() 现在支持
redirect
和 null
描述符。
<?php
// 就像 shell 上 2>&1
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// 就像 shell 上的 2>/dev/null 或 2>nul
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>
在不使用 libargon 的情况下编译 PHP 时,password_hash() 现在由 sodium 扩展实现了 argon2i 和 argon2id 。