PHP Conference Japan 2024

新特性

可空类型

参数和返回值的类型声明现在可以通过在类型名称前添加问号来标记为可空。这意味着除了指定的类型之外,还可以将null作为参数传递,或作为返回值返回。

<?php

function testReturn(): ?string
{
return
'elePHPant';
}

var_dump(testReturn());

function
testReturn(): ?string
{
return
null;
}

var_dump(testReturn());

function
test(?string $name)
{
var_dump($name);
}

test('elePHPant');
test(null);
test();

以上示例将输出

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

空函数

引入了void 返回类型。声明为 void 作为其返回类型的函数必须完全省略其 return 语句,或使用空 return 语句。null 不是空函数的有效返回值。

<?php
function swap(&$left, &$right): void
{
if (
$left === $right) {
return;
}

$tmp = $left;
$left = $right;
$right = $tmp;
}

$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

以上示例将输出

null
int(2)
int(1)

尝试使用空函数的返回值只会评估为null,不会发出警告。这样做的原因是警告会暗示使用通用高阶函数。

对称数组解构

现在可以使用简写数组语法 ([]) 对数组进行解构赋值(包括在 foreach 中),作为现有 list() 语法的替代方案,list() 语法仍然受支持。

<?php
$data
= [
[
1, 'Tom'],
[
2, 'Fred'],
];

// list() 样式
list($id1, $name1) = $data[0];

// [] 样式
[$id1, $name1] = $data[0];

// list() 样式
foreach ($data as list($id, $name)) {
// 此处使用 $id 和 $name 的逻辑
}

// [] 样式
foreach ($data as [$id, $name]) {
// 此处使用 $id 和 $name 的逻辑
}

类常量可见性

添加了对指定类常量可见性的支持。

<?php
class ConstDemo
{
const
PUBLIC_CONST_A = 1;
public const
PUBLIC_CONST_B = 2;
protected const
PROTECTED_CONST = 3;
private const
PRIVATE_CONST = 4;
}

iterable 伪类型

引入了一种新的伪类型(类似于 callable),称为 iterable。它可以在参数和返回值类型中使用,其中它接受实现 Traversable 接口的数组或对象。关于子类型,子类的参数类型可以将父类的 arrayTraversable 声明扩展为 iterable。对于返回值,子类可以将父类的 iterable 返回类型缩小为 array 或实现 Traversable 的对象。

<?php
function iterator(iterable $iter)
{
foreach (
$iter as $val) {
//
}
}

多重捕获异常处理

现在可以使用管道字符 (|) 在每个 catch 块中指定多个异常。当来自不同类层次结构的不同异常以相同方式处理时,这很有用。

<?php
try {
// 一些代码
} catch (FirstException | SecondException $e) {
// 处理第一个和第二个异常
}

list() 中支持键

您现在可以在 list() 或其新的简写语法 [] 中指定键。这使得可以解构具有非整数或非连续键的数组。

<?php
$data
= [
[
"id" => 1, "name" => 'Tom'],
[
"id" => 2, "name" => 'Fred'],
];

// list() 风格
list("id" => $id1, "name" => $name1) = $data[0];

// [] 风格
["id" => $id1, "name" => $name1] = $data[0];

// list() 风格
foreach ($data as list("id" => $id, "name" => $name)) {
// 这里的逻辑使用 $id 和 $name
}

// [] 风格
foreach ($data as ["id" => $id, "name" => $name]) {
// 这里的逻辑使用 $id 和 $name
}

支持负字符串偏移量

已将对负字符串偏移量的支持添加到接受偏移量的 字符串操作函数 以及使用 []{}字符串索引 中。在这种情况下,负偏移量被解释为从字符串末尾开始的偏移量。

<?php
var_dump
("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

以上示例将输出

string (1) "e"
int(3)

现在,字符串和数组的负偏移量也支持在字符串内部的简单变量解析语法中使用。

<?php
$string
= 'bar';
echo
"The last character of '$string' is '$string[-1]'.\n";
?>

以上示例将输出

The last character of 'bar' is 'r'.

在 ext/openssl 中支持 AEAD

通过扩展 openssl_encrypt()openssl_decrypt() 函数并添加其他参数,已添加对 AEAD(GCM 和 CCM 模式)的支持。

使用 Closure::fromCallable() 将可调用对象转换为 Closure 对象

Closure 类中引入了一种新的静态方法,以允许轻松地将 callable 转换为 Closure 对象。

<?php
class Test
{
public function
exposeFunction()
{
return
Closure::fromCallable([$this, 'privateFunction']);
}

private function
privateFunction($param)
{
var_dump($param);
}
}

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');

以上示例将输出

string(10) "some value"

异步信号处理

已引入一个名为 pcntl_async_signals() 的新函数,以启用异步信号处理,而无需使用滴答(这会引入大量开销)。

<?php
pcntl_async_signals
(true); // 打开异步信号

pcntl_signal(SIGHUP, function($sig) {
echo
"SIGHUP\n";
});

posix_kill(posix_getpid(), SIGHUP);

以上示例将输出

SIGHUP

在 ext/curl 中支持 HTTP/2 服务器推送

已将对服务器推送的支持添加到 CURL 扩展(需要 7.46 及更高版本)。这可以通过 curl_multi_setopt() 函数使用新的 CURLMOPT_PUSHFUNCTION 常量来利用。常量 CURL_PUSH_OKCURL_PUSH_DENY 也已添加,以便可以批准或拒绝服务器推送回调的执行。

流上下文选项

已添加 tcp_nodelay 流上下文选项。

添加注释

用户贡献的注释 2 条注释

DYM
6 年前
<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
unti1x
6 年前
请注意,声明可为空的返回类型并不意味着您可以完全跳过 return 语句。例如

php > function a(): ?string { }
php > a();
PHP Warning: Uncaught TypeError: Return value of a() must be of the type string or null, none returned in php shell code:2

php > function b(): ?string { return; }
PHP Fatal error: A function with return type must return a value (did you mean "return null;" instead of "return;"?) in php shell code on line 2
To Top