2024年PHP开发者大会日本站

新特性

新的对象类型

引入了一种新的类型 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 章节。

扩展 PDO 的字符串类型

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

这些常量通过将它们与 **PDO::PARAM_STR** 进行按位 OR 操作来使用。

<?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中引入的group-use语法中添加尾随逗号。

<?php

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

Windows上的 proc_nice() 支持

Windows现在支持 proc_nice() 函数。

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

pack()unpack() 函数现在支持小端和大端模式下的浮点数和双精度浮点数。

EXIF 扩展的增强

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

  • 三星
  • 大疆
  • 松下
  • 索尼
  • 宾得
  • 美能达
  • Sigma/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
4年前
注意:您不能更改接口中定义的抽象方法的参数类型。
<?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