物件屬性現在可以將額外邏輯与其 get
和 set
操作關聯。根據使用情況,這可能會也可能不會使屬性成為虛擬屬性,也就是說,它根本沒有備份值。
<?php
class Person
{
// 一個「虛擬」屬性。它可能不會被明確設定。
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}
// 所有寫入操作都會通過這個鉤子,而結果就是寫入的內容。
// 讀取操作則正常進行。
public string $firstName {
set => ucfirst(strtolower($value));
}
// 所有寫入操作都會通過這個鉤子,它必須寫入到支持值本身。
// 讀取操作則正常進行。
public string $lastName {
set {
if (strlen($value) < 2) {
throw new \InvalidArgumentException('太短');
}
$this->lastName = $value;
}
}
}
$p = new Person();
$p->firstName = 'peter';
print $p->firstName; // 顯示 "Peter"
$p->lastName = 'Peterson';
print $p->fullName; // 顯示 "Peter Peterson"
現在可以分別控制物件屬性的 set
可見性和 get
可見性。
<?php
class Example
{
// 第一個可見性修飾詞控制 get 可見性,第二個修飾詞控制 set 可見性。get 可見性的範圍不能小於 set 可見性。
public protected(set) string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
現在可以建立初始化延遲到被存取時才執行的物件。函式庫和框架可以利用這些惰性物件來延遲擷取初始化所需的資料或依賴項。
<?php
class Example
{
public function __construct(private int $data)
{
}
// ...
}
$initializer = static function (Example $ghost): void {
// 擷取資料或依賴項
$data = ...;
// 初始化
$ghost->__construct($data);
};
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);
#[\Deprecated]
屬性新的 Deprecated 屬性可以用來標記函式、方法和類別常數為已棄用。使用此屬性棄用的功能行為與現有 PHP 本身提供的棄用機制行為相符。唯一的例外是發出的錯誤碼是 E_USER_DEPRECATED
而不是 E_DEPRECATED
。
PHP 本身提供的現有棄用功能已更新為使用此屬性,並透過包含簡短說明來改進發出的錯誤訊息。
新增了 request_parse_body() 函式,允許在非 POST HTTP 請求中解析 RFC1867 (multipart) 請求。
new
運算式帶有建構函式引數的 new 運算式現在可以被解參考,這意味著它們允許在不將運算式括在括號中的情況下串接方法呼叫、屬性存取等。
取得 WeakReference 的除錯資訊現在也會輸出它所參考的物件,如果參考不再有效,則會輸出 null
。
退出命名空間現在會清除已看到的符號。即使先前的命名空間區塊宣告了具有相同名稱的符號,這也允許在命名空間區塊中使用符號。
curl_version() 會傳回一個額外的 feature_list
值,它是一個包含所有已知 cURL 功能的關聯陣列,以及它們是否受支援 (true
) 或不受支援 (false
)。
新增了 CURL_HTTP_VERSION_3
和 CURL_HTTP_VERSION_3ONLY
常數(自 libcurl 7.66 和 7.88 起可用)作為 CURLOPT_HTTP_VERSION
的可用選項。
新增了 CURLOPT_PREREQFUNCTION
作為一個 cURL 選項,它接受一個 可呼叫物件,在連線建立後、請求發送前被呼叫。這個可呼叫物件必須返回 CURL_PREREQFUNC_OK
或 CURL_PREREQFUNC_ABORT
來允許或中止請求。
新增了 CURLOPT_SERVER_RESPONSE_TIMEOUT
,它以前稱為 CURLOPT_FTP_RESPONSE_TIMEOUT
。兩個常數的值相同。
新增了 CURLOPT_DEBUGFUNCTION
作為一個 cURL 選項,它接受一個 可呼叫物件,在請求生命週期中被呼叫,並傳入 CurlHandle 物件、包含除錯訊息類型的整數和包含除錯訊息的字串。除錯訊息類型是以下常數之一:
CURLINFO_TEXT
CURLINFO_HEADER_IN
CURLINFO_HEADER_OUT
CURLINFO_DATA_IN
CURLINFO_DATA_OUT
CURLINFO_SSL_DATA_IN
CURLINFO_SSL_DATA_OUT
CURLINFO_HEADER_OUT
,因為它使用相同的 libcurl 功能。
curl_getinfo() 現在會返回一個額外的 `posttransfer_time_us` 鍵,包含從開始到最後一個位元組發送所經過的微秒數。當發生重新導向時,每個請求的時間會加總在一起。也可以透過將 CURLINFO_POSTTRANSFER_TIME_T
傳遞給 curl_getinfo() 的 `option` 參數來取得此值。這需要 libcurl 8.10.0 或更高版本。
新增了 Dom 命名空間以及與現有 DOM 類別對應的新類別(例如 Dom\Node 是新的 DOMNode)。這些類別與 HTML 5 相容,並且符合 WHATWG 規範;解決了 DOM 擴充功能中長期存在的錯誤。舊的 DOM 類別仍然可用,以確保向下相容。
新增了 DOMNode::compareDocumentPosition() 以及其相關的常數:
DOMNode::DOCUMENT_POSITION_DISCONNECTED
DOMNode::DOCUMENT_POSITION_PRECEDING
DOMNode::DOCUMENT_POSITION_FOLLOWING
DOMNode::DOCUMENT_POSITION_CONTAINS
DOMNode::DOCUMENT_POSITION_CONTAINED_BY
DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
現在可以將任何可呼叫物件傳遞給 DOMXPath::registerPhpFunctions()。此外,使用 DOMXPath::registerPhpFunctionNs(),現在可以註冊使用原生函數呼叫語法而不是使用 php:function('name')
的回呼函數。
新增了 NumberFormatter::ROUND_HALFODD
來補充現有的 NumberFormatter::ROUND_HALFEVEN
功能。
新增了對基於 Curve25519 + Curve448 金鑰的支援。具體來說,openssl_pkey_new()、openssl_pkey_get_details()、openssl_sign() 和 openssl_verify() 中支援 x25519、ed25519、x448 和 ed448 欄位,並已擴展以支援這些金鑰。
實作 PASSWORD_ARGON2 密碼雜湊演算法。需要 OpenSSL 3.2 和 NTS 建置。
內建的 pcre2lib 已更新至 10.44 版。因此,新增了 LoongArch JIT 支援,現在允許在 Perl 相容項目的大括號之間使用空格,並且支援可變長度的回溯斷言。
在 pcre2lib 10.44 版中,命名擷取群組的最大長度已從 32
變更為 128
。
新增了對 r
(PCRE2_EXTRA_CASELESS_RESTRICT) 修飾符以及 (?r)
模式修飾符的支援。當與不區分大小寫的修飾符 (i
) 一起啟用時,表示式會鎖定 ASCII 和非 ASCII 字元的混合使用。
新增了對驅動程式特定子類別的支援。此 RFC 為 PDO 新增了子類別,以便更好地支援資料庫特定的功能。可以透過呼叫 PDO::connect() 方法或直接實例化驅動程式特定子類別的實例來實例化新的類別。
新增了對驅動程式特定 SQL 解析器的支援。預設解析器支援:
新增了一個自定義解析器,支援:
新增了一個自定義解析器,支援:
E'string'
)??
作為 ?
運算子的跳脫序列新增了一個自定義解析器,支援:
新增了對 Zip 封存檔的 Unix 時間戳記擴充的支援。
新增了透過 PHP_HISTFILE 環境變數更改 .php_history
路徑的功能。
ReflectionAttribute 現在包含一個 name 屬性,以改善除錯體驗。
ReflectionClassConstant::__toString() 和 ReflectionProperty::__toString() 現在會傳回附加的程式碼註解。
新增了多個與惰性物件功能相關的新方法和常數
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
ReflectionClass::SKIP_DESTRUCTOR
在類別映射中新增了對命名空間的 clark 標記法的支援。現在可以使用 clark 標記法在類別映射中指定項目,以將具有特定命名空間的類型解析為特定類別。例如:'{http://example.com}foo' => 'FooClass'
。
傳遞給 xsd:datetime
或類似元素的 DateTimeInterface 實例現在會被序列化為此類元素,而不是被序列化為空字串。
工作階段持續性現在可以與共用的工作階段模組一起使用。
新增了一個新的 RoundingMode 列舉,與 PHP_ROUND_*
常數相比,它具有更清晰的命名和更好的可探索性。此外,還新增了四種新的捨入模式,這些模式只能透過新的 RoundingMode 列舉使用。
現在可以使用包含單引號和雙引號的參數。
現在可以將任何可呼叫的物件傳遞給 XSLTProcessor::registerPhpFunctions()。
新增了 XSLTProcessor::$maxTemplateDepth 和 XSLTProcessor::$maxTemplateVars 來控制 XSL 樣板評估的遞迴深度。
新增了 ZipArchive::ER_TRUNCATED_ZIP
常數,該常數在 libzip 1.11 中新增。