2024 PHP Conference Japan

新功能

可空型別

現在,參數和回傳值的型別宣告可以透過在型別名稱前加上問號來標記為可空。這表示除了指定的型別之外,還可以分別傳遞 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 返回類型。宣告為 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;
}

可迭代 (Iterable) 偽類型

引進了一個新的偽類型(類似於 可呼叫 (Callable))稱為 可迭代 (Iterable)。它可以用於參數和返回類型,它可以接受陣列或實作 Traversable 介面的物件。關於子類型,子類別的參數類型可以將父類別宣告的 陣列 (Array)Traversable 擴展為 可迭代 (Iterable)。對於返回類型,子類別可以將父類別返回的 可迭代 (Iterable) 類型縮小為 陣列 (Array) 或實作 Traversable 的物件。

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

多重 catch 例外處理

現在可以使用管道符號 (|) 在每個 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 類別中引入了一個新的靜態方法,允許輕鬆地將 可呼叫物件 轉換為 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

ext/curl 中的 HTTP/2 伺服器推送支援

CURL 擴充套件已新增伺服器推送支援(需要 7.46 或更高版本)。這可以透過 curl_multi_setopt() 函式與新的CURLMOPT_PUSHFUNCTION 常數來運用。 也新增了常數 CURL_PUSH_OKCURL_PUSH_DENY,以便伺服器推送回呼的執行可以被批准或拒絕。

資料流上下文選項

已新增 tcp_nodelay 資料流上下文選項。

新增註釋

使用者貢獻的註釋 2 則註釋

75
DYM
6 年前
<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
26
unti1x
6 年前
請注意,宣告可為 Null 的返回類型並不意味著您可以完全跳過 return 陳述式。例如

php > function a(): ?string { }
php > a();
PHP 警告:未捕獲的 TypeError:a() 的返回值必須是字串類型或 null,php shell code:2 中未返回任何值

php > function b(): ?string { return; }
PHP 致命錯誤:具有返回類型的函式必須返回一個值(您是指「return null;」而不是「return;」嗎?)位於 php shell code 的第 2 行
To Top