新特性

可空类型

参数和返回值的类型声明现在可以通过在类型名前添加问号来标记为可空。这表示除了指定的类型外,还可以将 **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** 不是 void 函数的有效返回值。

<?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)

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

对称数组解构

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

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

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

// [] style
[$id1, $name1] = $data[0];

// list() style
foreach ($data as list($id, $name)) {
// logic here with $id and $name
}

// [] style
foreach ($data as [$id, $name]) {
// logic here with $id and $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 伪类型

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

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

多捕获异常处理

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

<?php
try {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
}

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 类中引入了一个新的静态方法,允许轻松地将 可调用对象 转换为 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