PHP 7.4.0正式发布了,提供有php-7.4.0.tar.bz2/tar.gz/tar.xz包下载,它带来了一些新的特性和新的功能,包括PHP核心部分,使用PHP 7.3.x的用户现在就可以迁移到PHP 7.4.x,以下为你介绍重点的更新。安装参考:在Ubuntu 18.04/19.04/16.04版本上安装PHP 7.4的简单方法。
PHP 7.4.0新特性及新功能介绍
1、Typed properties(类型属性)
类属性现在支持类型声明:
class User {
public int $id;
public string $name;
}
?>
上面的示例将强制$user->id只能分配整数值,而$user->name只能分配字符串值。
2、Arrow functions(箭头功能)
箭头函数提供了用于定义具有隐式按值作用域绑定的函数的简写语法:
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>
3、有限返回类型协方差和参数类型协方差
现在,以下代码将起作用:
class A {}
class B extends A {}
class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
?>
仅当使用自动加载时,才提供完全差异支持,在单个文件中,只能使用非循环类型引用,因为所有类在被引用之前都必须可用。
4、空合并分配运算符
$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>
5、在数组内部解包
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>
6、数值文字分隔符
数字文字可以在数字之间包含下划线:
6.674_083e-11; // float
299_792_458; // decimal
0xCAFE_F00D; // hexadecimal
0b0101_1111; // binary
?>
7、参考不足
弱引用使程序员可以保留对对象的引用,这不会阻止对象被破坏。
8、允许__toString()中的异常
现在允许从__toString()引发异常,以前,这导致了重要的错误,字符串转换中现有的可恢复重要错误已转换为错误异常。
9、CURL
如果扩展是针对libcurl >= 7.56.0构建的,则CURLFile现在除了普通文件名之外还支持流包装器。
10、Filter(过滤)
FILTER_VALIDATE_FLOAT过滤器现在支持min_range和max_range选项,其语义与FILTER_VALIDATE_INT相同。
11、FFI
FFI是一个新扩展,它提供了一种简单的方法来调用本机函数,访问本机变量以及创建/访问C库中定义的数据结构。
12、GD
添加了IMG_FILTER_SCATTER图像过滤器,以将散射过滤器应用于图像。
13、Hash
使用Castagnoli的多项式添加了crc32c哈希,此CRC32变体供存储系统使用,例如iSCSI、SCTP、Btrfs和ext4。
14、Multibyte String(多字节字符串)
添加了mb_str_split()函数,该函数提供与str_split()相同的功能,但是对代码点而不是字节进行操作。
15、OP缓存
添加了对预加载代码的支持。
16、正则表达式(与Perl兼容)
现在,preg_replace_callback()和preg_replace_callback_array()函数接受附加的flags参数,并支持PREG_OFFSET_CAPTURE和PREG_UNMATCHED_AS_NULL选项,这会影响传递给回调函数的matchs数组的格式。
17、PDO
现在可以将用户名和密码指定为mysql、mssql、sybase、dblib、firebird和oci驱动程序的PDO DSN的一部分,以前,这仅受pgsql驱动程序支持,如果在构造函数和DSN中都指定了用户名/密码,则构造函数优先。
现在可以在SQL查询中转义问号,以避免将它们解释为参数占位符,写作??允许向数据库发送单个问号,例如使用PostgreSQL JSON密钥存在(?)运算符。
18、PDO_OCI
PDOStatement::getColumnMeta()现在可用。
19、PDO_SQLite
PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)允许检查该语句是否为只读,即是否不修改数据库。
PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)允许在PDO::errorInfo()和PDOStatement::errorInfo()中使用SQLite3扩展结果代码。
20、SQLite3
添加了SQLite3::lastExtendedErrorCode()以获取最后的扩展结果代码。
添加了SQLite3::enableExtendedResultCodes($enable = true),这将使SQLite3::lastErrorCode()返回扩展结果代码。
21、带标签名称数组的strip_tags()
strip_tags()现在还接受允许的标签数组:现在,你可以编写strip_tags($str, '
')来代替strip_tags($str, ['a', 'p'])。
22、自定义对象序列化
添加了用于自定义对象序列化的新机制,该机制使用了两个新的方法:__serialize和__unserialize:
// Returns array containing all the necessary state of the object.
public function __serialize(): array;
// Restores the object state from the given data array.
public function __unserialize(array $data): void;
?>
新的序列化机制取代了Serializable接口,该接口将在以后弃用。
23、没有参数的数组合并功能
现在可以不带任何参数地调用array_merge()和array_merge_recursive(),在这种情况下,它们将返回一个空数组,与扩展操作符,例如array_merge(...$arrays)。
24、proc_open()函数
proc_open()现在接受命令数组而不是字符串,在这种情况下,该过程将直接打开(无需通过shell),PHP将处理任何必要的参数转义:
proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>
proc_open()现在支持重定向和空描述符:
// Like 2>&1 on the shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// Like 2>/dev/null or 2>nul on the shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>
25、不含libargon的argon2i(d)
当PHP在没有libargon的情况下构建时,password_hash()现在具有sodium扩展中的argon2i和argin2id实现。
下载链接
相关主题