新特性

新对象类型

引入了一种新的类型,object,它可用于(逆变)参数类型化和(协变)返回类型化任何对象。

<?php

function test(object $obj) : object
{
return new
SplQueue();
}

test(new stdClass());

按名称加载扩展

共享扩展不再需要指定其文件扩展名(对于 Unix 为 .so,对于 Windows 为 .dll)。这在 php.ini 文件和 dl() 函数中都已启用。

抽象方法覆盖

当抽象类扩展另一个抽象类时,现在可以覆盖抽象方法。

<?php

abstract class A
{
abstract function
test(string $s);
}
abstract class
B extends A
{
// 覆盖 - 仍然保持参数的逆变和返回的协变
abstract function test($s) : int;
}

Sodium 现在是核心扩展

现代 Sodium 密码库现在已成为 PHP 的核心扩展。

有关完整函数参考,请参阅 Sodium 章节。

使用 Argon2 进行密码散列

Argon2 已添加到 密码散列 API 中,其中公开了以下常量

扩展的字符串类型用于 PDO

PDO 的字符串类型已扩展为在模拟预处理时支持国家字符类型。这是通过以下常量完成的

这些常量通过按位 OR 操作与 PDO::PARAM_STR 相结合来使用

<?php

$db
->quote('über', PDO::PARAM_STR | PDO::PARAM_STR_NATL);

PDO 添加模拟预处理调试信息

PDOStatement::debugDumpParams() 方法已更新,包括发送到数据库的 SQL,其中将显示完整的原始查询(包括用其绑定值替换的占位符)。这已添加以帮助调试模拟预处理(因此只有在启用模拟预处理时才可用)。

支持 LDAP 中的扩展操作

LDAP 扩展已添加对 EXOP 的支持。这是通过公开以下函数和常量实现的

Sockets 扩展的地址信息添加

sockets 扩展现在能够查找地址信息,以及连接到它、绑定到它和解释它。为此添加了以下四个函数

参数类型扩展

来自覆盖方法和接口实现的参数类型现在可以省略。这仍然符合 LSP,因为参数类型是逆变的。

<?php

interface A
{
public function
Test(array $input);
}

class
B implements A
{
public function
Test($input){} // $input 的类型省略了
}

允许分组命名空间使用尾随逗号

现在可以在 PHP 7.0 中引入的分组使用语法中添加尾随逗号。

<?php

use Foo\Bar\{
Foo,
Bar,
Baz,
};

proc_nice() 在 Windows 上的支持

proc_nice() 函数现在在 Windows 上得到支持。

pack()unpack() 的字节序支持

pack()unpack() 函数现在在小端和大端中都支持浮点数和双精度数。

EXIF 扩展的增强

EXIF 扩展已更新以支持更大范围的格式。这意味着在使用 exif_read_data() 函数解析图像时,它们的格式特定标签现在会得到正确转换。现在支持以下新格式

  • 三星
  • 大疆
  • 松下
  • 索尼
  • 宾得
  • 美能达
  • 西格玛/Foveon
  • 爱克发
  • 京瓷
  • 理光
  • 爱普生

EXIF 函数 exif_read_data()exif_thumbnail() 现在支持将流作为其第一个参数传递。

PCRE 中的新特性

  • 已添加用于设置 PCRE_DUPNAMES 的 J 修饰符。

SQLite3 允许写入 BLOB

SQLite3::openBlob() 现在允许以写入模式打开 BLOB 字段;以前只支持读取模式。

Oracle OCI8 透明应用程序故障转移回调

已添加对 Oracle 数据库透明应用程序故障转移 (TAF) 回调 的支持。TAF 允许 PHP OCI8 应用程序在连接断开时自动重新连接到预配置的数据库。新的 TAF 回调支持允许 PHP 应用程序在故障转移期间监视和控制重新连接。

ZIP 扩展的增强

已添加对加密存档的读写支持(需要 libzip 1.2.0)。

ZipArchive 类现在实现了 Countable 接口。

zip:// 流现在接受 'password' 上下文选项。

添加备注

用户贡献的备注 2 备注

antonfedonyuk at gmail dot com
3 年前
注意:“省略” = “删除”
<?php
declare(strict_types=1);

interface
ITest
{
public function
run(array $input);
}

class
Test implements ITest
{
public function
run($input) {
return
$input;
}
}

echo (new
Test())->run('foo'); // 显示 foo,无错误
?>
info at ensostudio dot ru
3 年前
注意:你不能更改接口中定义的抽象方法的参数类型。
<?php
abstract class AbstractAssocArray imlements ArrayAccess
{
abstract public function
offsetSet($offset, $value): void;
...
}
abstract class
AbstractAssocArray2 extends AbstractAssocArray
{
abstract public function
offsetSet(string $offset, $value): void;
}
class
AssocArray extends AbstractAssocArray2
{
public function
offsetSet(string $offset, $value): void
{
$this->{$offset} = $value;
}
}
?>
这将抛出致命错误:AbstractAssocArray::offsetSet(string $offset, $value): void 的声明必须与 AbstractAssocArrayAccess::offsetSet($offset, $value) 兼容。
To Top