<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
参数和返回值的类型声明现在可以通过在类型名称前添加问号来标记为可空。这意味着除了指定的类型之外,还可以将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;
}
引入了一种新的伪类型(类似于 callable),称为 iterable。它可以在参数和返回值类型中使用,其中它接受实现 Traversable 接口的数组或对象。关于子类型,子类的参数类型可以将父类的 array 或 Traversable 声明扩展为 iterable。对于返回值,子类可以将父类的 iterable 返回类型缩小为 array 或实现 Traversable 的对象。
<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}
现在可以使用管道字符 (|
) 在每个 catch 块中指定多个异常。当来自不同类层次结构的不同异常以相同方式处理时,这很有用。
<?php
try {
// 一些代码
} catch (FirstException | SecondException $e) {
// 处理第一个和第二个异常
}
您现在可以在 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'.
通过扩展 openssl_encrypt() 和 openssl_decrypt() 函数并添加其他参数,已添加对 AEAD(GCM 和 CCM 模式)的支持。
在 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
已将对服务器推送的支持添加到 CURL 扩展(需要 7.46 及更高版本)。这可以通过 curl_multi_setopt() 函数使用新的 CURLMOPT_PUSHFUNCTION
常量来利用。常量 CURL_PUSH_OK
和 CURL_PUSH_DENY
也已添加,以便可以批准或拒绝服务器推送回调的执行。
已添加 tcp_nodelay 流上下文选项。
请注意,声明可为空的返回类型并不意味着您可以完全跳过 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