PHP 8.2.0 Released!

新特性

新的对象类型

这种新的对象类型, object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。

<?php

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

test(new StdClass());

通过名称加载扩展

扩展文件不再需要通过文件加载 (Unix下以.so为文件扩展名,在Windows下以 .dll 为文件扩展名) 进行指定。可以在php.ini配置文件进行启用, 也可以使用 dl() 函数进行启用。

重写抽象方法(Abstract method)

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

<?php

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

Sodium 现在是核心扩展

现代 Sodium 加密类已经成为 PHP 核心扩展。

参阅 Sodium 章节获取完整函数参考。

使用 Argon2 算法生成密码散列

Argon2 已经加入到密码散列 API, 以下是显露出来的常量:

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

新增 PDO 字符串扩展类型

当你准备支持多语言字符集,PDO的字符串类型已经扩展支持国际化的字符集。以下是扩展的常量:

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM

这些常量通过PDO::PARAM_STR利用位运算OR进行计算:

<?php

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

PDO 新增额外的模拟调试信息

PDOStatement::debugDumpParams()方法已经更新,当发送SQL到数据库的时候,在一致性、行查询(包括替换绑定占位符)将会显示调试信息。这一特性已经加入到模拟调试中(在模拟调试打开时可用)。

LDAP 支持新的操作方式

LDAP 扩展已经新增了EXOP支持. 扩展暴露以下函数和常量:

Socket 扩展添加了地址信息

Socket 扩展现在具有查找地址信息的能力,且可以连接到这个地址,或者进行绑定和解析。为此添加了以下一些函数:

扩展了参数类型

重写方法和接口实现的参数类型现在可以省略了。不过这仍然是符合LSP,因为现在这种参数类型是逆变的。

<?php

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

class 
implements A
{
    public function 
Test($input){} // type omitted for $input
}

允许分组命名空间的尾部逗号

命名空间可以在PHP 7中使用尾随逗号进行分组引入。

<?php

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

proc_nice() 现在支持 Windows

proc_nice() 函数现在支持 Windows。

pack()unpack() 字节序支持

pack()unpack() 函数现在 float 和 double 都支持大小端。

EXIF 扩展增强

EXIF 扩展已更新以支持更多的格式。这意味着使用 exif_read_data() 函数解析图片时,现在可以正确转换图片格式的特定标签。现在支持下面这些新格式:

  • Samsung
  • DJI
  • Panasonic
  • Sony
  • Pentax
  • Minolta
  • Sigma/Foveon
  • AGFA
  • Kyocera
  • Ricoh
  • Epson

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' 上下文选项。

add a note

User Contributed Notes 2 notes

up
3
antonfedonyuk at gmail dot com
1 year ago
Note: "omitted" = "removed":
<?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'); // display foo, no error
?>
up
-1
info at ensostudio dot ru
2 years ago
Note: you cant change parameter type for abstract method defined in interface.
<?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;
    }
}
?>
It's throw fatal error: Declaration of AbstractAssocArray::offsetSet(string $offset, $value): void must be compatible with AbstractAssocArrayAccess::offsetSet($offset, $value).
To Top