<?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
並不是 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() 語法的替代方案,而 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 類別中引入了一個新的靜態方法,允許輕鬆地將 可呼叫物件 轉換為 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() 的新函式,可以在不使用 ticks(會產生大量負荷)的情況下啟用非同步訊號處理。
<?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 資料流上下文選項。