已新增具名引數的支援。
已新增屬性的支援。
已新增建構子屬性提升(在建構子簽章中宣告屬性)的支援。
已新增聯集類型的支援。
新增了對 match
表達式 的支援。
新增了對 nullsafe 運算子 (?->
) 的支援。
新增了 WeakMap 類別。
新增了 ValueError 類別。
現在可以將任意數量的函式參數替換為可變參數,只要類型相容即可。例如,現在允許以下程式碼:
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>
static(如「後期靜態綁定」中所示)現在可以用作返回類型。
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
現在可以使用 $object::class
获取物件的類別名稱。結果與 get_class($object)
相同。
new
和 instanceof
現在可以與任意表達式一起使用,使用 new (expression)(...$args)
和 $obj instanceof (expression)
。
已套用一些變數語法的 consistency 修正,例如現在允許編寫 Foo::BAR::$baz
。
新增了 Stringable 介面,如果類別定義了 __toString() 方法,則會自動實作此介面。
Traits 現在可以定義抽象私有方法。使用該 trait 的類別必須實作此類方法。
throw
現在可以用作表達式。這允許如下用法:
<?php
$fn = fn() => throw new Exception('Exception in arrow function');
$user = $session->user ?? throw new Exception('Must have user');
現在在參數列表中允許使用可選的尾隨逗號。
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- 現在允許使用這個逗號。
) {
}
現在可以寫成 catch (Exception)
來捕捉例外,而無需將其儲存在變數中。
已新增對 mixed 類型的支援。
在父類別中宣告的私有方法不再對子類別的方法強制執行任何繼承規則(除了 final 的私有建構函式之外)。以下範例說明已移除哪些限制
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// 會發出警告,因為 "final" 不再有效:
private final function method4() {}
}
class ChildClass extends ParentClass {
// 現在允許以下所有內容,即使修飾詞與父類別中私有方法的修飾詞不同。
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
已新增 get_resource_id(),它會傳回與 (int) $resource
相同的值。它在更清晰的 API 下提供相同的功能。
已新增 InternalIterator。
已新增 DateTime::createFromInterface() 和 DateTimeImmutable::createFromInterface()。
已新增 DateTime 格式指定符 p
,它與 P
相同,但對於 UTC 傳回 Z
而不是 +00:00
。
已新增具有新的遍歷和操作 API 的 DOMParentNode 和 DOMChildNode。
已新增 FILTER_VALIDATE_BOOL
作為 FILTER_VALIDATE_BOOLEAN
的別名。建議使用新的名稱,因為它使用標準類型名稱。
已新增 enchant_dict_add()、enchant_dict_is_added() 和 LIBENCHANT_VERSION
。
新增了一個新的選項 pm.status_listen
,允許從不同的端點(例如端口或 UDS 檔案)獲取狀態,這在所有子進程都忙於處理長時間運行的請求時獲取狀態非常有用。
HashContext 物件現在可以序列化。
新增了 IntlDateFormatter::RELATIVE_FULL
、IntlDateFormatter::RELATIVE_LONG
、IntlDateFormatter::RELATIVE_MEDIUM
和 IntlDateFormatter::RELATIVE_SHORT
常數。
新增了 ldap_count_references() 函式,用於返回搜尋結果中參考訊息的數量。
如果啟用 opcache.record_warnings ini 設定,OPcache 將會記錄編譯時期的警告,並在下次 include 時重播這些警告,即使它是從快取中提供的。
新增了加密訊息語法 (CMS) (» RFC 5652) 支援,包含用於加密、解密、簽署、驗證和讀取的函式。API 與 PKCS #7 函式的 API 類似,並新增了新的編碼常數:OPENSSL_ENCODING_DER
、OPENSSL_ENCODING_SMIME
和 OPENSSL_ENCODING_PEM
。
新增了 preg_last_error_msg() 函式,用於返回最後一個 PCRE 錯誤的人類可讀訊息。它補充了 preg_last_error(),後者返回的是整數列舉值。
新增了 SQLite3::setAuthorizer() 和相關的類別常數,用於設定一個使用者層級的回呼函式,該函式將用於授權或拒絕對資料庫的操作。
新增了 str_contains()、str_starts_with() 和 str_ends_with() 函式,分別用於檢查 haystack
是否包含、以 needle
開頭或以 needle
結尾。
新增了 fdiv() 函式,它會根據 IEEE 754 語義執行浮點數除法。除以零被認為是明確定義的,並將返回 Inf
、-Inf
或 NaN
其中之一。
新增了 get_debug_type() 函式,它會返回一個可用於錯誤訊息的類型。與 gettype() 不同,它使用標準的類型名稱,為物件返回類別名稱,並指出資源的資源類型。
printf() 和相關函式現在支援 %h
和 %H
格式指定符。它們與 %g
和 %G
相同,但始終使用 "."
作為小數點分隔符號,而不是透過 LC_NUMERIC
語系設定來決定。
printf() 和相關函式現在支援使用 "*"
作為寬度或精度,在這種情況下,寬度/精度會作為參數傳遞給 printf。這也允許在 %g
、%G
、%h
和 %H
中使用精度 -1
。例如,以下程式碼可用於重現 PHP 的預設浮點數格式
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
proc_open() 現在支援偽終端 (PTY) 描述元。以下程式碼將 stdin
、stdout
和 stderr
連接到同一個 PTY
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
proc_open() 現在支援套接字對描述元。以下程式碼將不同的套接字對連接到 stdin
、stdout
和 stderr
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
與管道不同,套接字在 Windows 上不會遇到阻塞 I/O 問題。然而,並非所有程式都能正確地使用 stdio 套接字。
排序函式現在是穩定的,這意味著比較相等的元素將保留其原始順序。
array_diff()、array_intersect() 和其變體現在可以單獨使用一個陣列作為參數。這表示現在可以使用以下用法
<?php
// 即使 $excludes 為空也沒問題:
array_diff($array, ...$excludes);
// 即使 $arrays 只包含一個陣列也沒問題:
array_intersect(...$arrays);
?>
ob_implicit_flush() 的 flag
參數已更改為接受 bool 值,而不是 int 值。
PhpToken 為詞法分析器新增了一個基於物件的介面。它提供更一致且符合人體工學的表示方式,同時更節省記憶且速度更快。
Zip 擴充套件已更新至 1.19.1 版本。
新增 ZipArchive::setMtimeName() 和 ZipArchive::setMtimeIndex() 來設定項目的修改時間。
新增 ZipArchive::registerProgressCallback() 以在關閉壓縮檔期間提供更新。
新增 ZipArchive::registerCancelCallback() 以允許在關閉壓縮檔期間取消操作。
新增 ZipArchive::replaceFile() 以取代項目內容。
新增 ZipArchive::isCompressionMethodSupported() 來檢查選用的壓縮功能。
新增 ZipArchive::isEncryptionMethodSupported() 來檢查選用的加密功能。
新增了 ZipArchive::lastId 屬性,用於取得最後新增項目的索引值。
現在可以使用 ZipArchive::status 和 ZipArchive::statusSys 屬性,或 ZipArchive::getStatusString() 方法,在壓縮檔關閉後檢查錯誤。
ZipArchive::addGlob() 和 ZipArchive::addPattern() 的 'remove_path'
選項現在被視為任意字串前綴(為了與 'add_path'
選項保持一致),而以前它被視為目錄名稱。
選用的壓縮/加密功能現在會列在 phpinfo 中。