PHP 7.4 新功能

PHP 核心
标题类型化属性

类属性现在支持类型声明。

<?php
class User {
    public int $id;
    public string $name;
}
?>

上面的示例将强制$user->id只能分配整数值,而$user->name只能分配字符串值。

箭头函数

箭头函数提供了一种简单的语法,用于定义具有隐式按值范围绑定的函数。

<?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()的异常:

现在允许从__toString()引发异常。以前这会导致致命错误。字符串转换中现有的可恢复致命错误已被转换为错误异常。


CURL

如果扩展名是针对libcurl>=7.56.0构建的,那么CURLFile现在除了支持纯文件名之外还支持流包装器。


过滤器 Filter

FILTER_VALIDATE_FLOAT 过滤器现在支持min_rangemax_range选项,其语义与FILTER_VALIDATE_INT相同。


FFI (关于何为FFI可以查看这里)

FFI是一个新的扩展,它提供了调用本机函数、访问本机变量和创建/访问C库中定义的数据结构的简单方法。


GD

添加了IMG_FILTER_SCATTER 图片过滤器以对图像应用散射过滤器。


Hash

使用Castagnoli多项式添加crc32c散列。存储系统(如iSCSI、SCTP、Btrfs和ext4)使用此CRC32变体。


多字节字符串 Multibyte String

添加了mb_str_split()函数,该函数提供与str_split()相同的功能,但操作代码点而不是字节。


操作缓存 OPcache

已添加对预加载代码的支持。


正则表达式(Perl兼容)Regular Expressions (Perl-Compatible)

preg_replace_callback()preg_replace_callback_array()函数现在接受一个额外的flags参数,支持PREG_OFFSET_CAPTUREPREG_UNMATCHED_AS_NULL标志。这会影响传递给回调函数的matches数组的格式。


PDO

用户名和密码现在可以指定为mysql、mssql、sybase、dblib、firebird和oci驱动程序的PDO DSN的一部分。以前,这仅由pgsql驱动程序支持。如果在构造函数和DSN中都指定了用户名/密码,则构造函数优先。

现在可以在SQL查询中转义问号,以避免它们被解释为参数占位符。写作??允许向数据库发送单个问号,例如使用PostgreSQL JSON关键字存在(?)接线员。


PDO_OCI

PDOStatement::getColumnMeta()现在可用


PDO_SQLite

PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)允许检查语句是否为只读,如果它不修改数据库。

PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true) 允许在PDO::errorInfo()PDOStatement::errorInfo()中使用SQLite3扩展结果代码。


SQLite3

添加了SQLite3::lastExtendedErrorCode()以获取最后一个扩展的结果代码。

添加了SQLite3::enableExtendedResultCodes($enable = true),这将使SQLite3::lastErrorCode()返回扩展的结果代码。


标准 Standard
strip_tags() 带标记名数组

strip_tags()现在还接受一组允许的标记:现在可以编写strip_tags($str, ['a', 'p']),而不是strip_tags($str, '<a><p>')

自定义对象序列化 Custom object serialization

添加了一种新的自定义对象序列化机制,它使用了两个新的magic方法: __serializeand__unserialize.

<?php
// 返回包含对象所有必需状态的数组。
public function __serialize(): array;

// 从给定的数据数组还原对象状态。
public function __unserialize(array $data): void;
?>

新的序列化机制将取代可序列化接口(Serializable),该接口在将来将被弃用。

不带参数的数组合并函数

array_merge()array_merge_recursive() 现在可以在不带任何参数的情况下调用,在这种情况下,它们将返回一个空数组。这与spread运算符结合使用非常有用,例如array_merge(…$arrays)

proc_open()函数

proc_open()现在接受一个数组,而不是命令的字符串。在这种情况下,进程将直接打开(不经过shell),PHP将处理任何必要的参数转义。

<?php
proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>

proc_open()现在支持重定向和空描述符。

<?php
// 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);
?>
argon2i(d) 没有 libargon

password_hash()在没有libargon的情况php构建时有了扩展的argon2i和argin2id实现。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值