2024 PHP Conference Japan

新功能

PHP 核心

屬性掛鉤

物件屬性現在可以將額外邏輯与其 getset 操作關聯。根據使用情況,這可能會也可能不會使屬性成為虛擬屬性,也就是說,它根本沒有備份值。

<?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 本身提供的現有棄用功能已更新為使用此屬性,並透過包含簡短說明來改進發出的錯誤訊息。

在非 POST HTTP 請求中解析 RFC1867 (multipart) 請求

新增了 request_parse_body() 函式,允許在非 POST HTTP 請求中解析 RFC1867 (multipart) 請求。

不使用括號串接 new 運算式

帶有建構函式引數的 new 運算式現在可以被解參考,這意味著它們允許在不將運算式括在括號中的情況下串接方法呼叫、屬性存取等。

改進了 WeakReference 的除錯資訊

取得 WeakReference 的除錯資訊現在也會輸出它所參考的物件,如果參考不再有效,則會輸出 null

改進了 Closure 的除錯資訊

Closure::__debugInfo() 的輸出現在包含 Closure 的名稱、檔案和行數。

在不同的命名空間區塊中定義相同的符號

退出命名空間現在會清除已看到的符號。即使先前的命名空間區塊宣告了具有相同名稱的符號,這也允許在命名空間區塊中使用符號。

cURL

curl_version() 會傳回一個額外的 feature_list 值,它是一個包含所有已知 cURL 功能的關聯陣列,以及它們是否受支援 (true) 或不受支援 (false)。

新增了 CURL_HTTP_VERSION_3CURL_HTTP_VERSION_3ONLY 常數(自 libcurl 7.66 和 7.88 起可用)作為 CURLOPT_HTTP_VERSION 的可用選項。

新增了 CURLOPT_PREREQFUNCTION 作為一個 cURL 選項,它接受一個 可呼叫物件,在連線建立後、請求發送前被呼叫。這個可呼叫物件必須返回 CURL_PREREQFUNC_OKCURL_PREREQFUNC_ABORT 來允許或中止請求。

新增了 CURLOPT_SERVER_RESPONSE_TIMEOUT,它以前稱為 CURLOPT_FTP_RESPONSE_TIMEOUT。兩個常數的值相同。

新增了 CURLOPT_DEBUGFUNCTION 作為一個 cURL 選項,它接受一個 可呼叫物件,在請求生命週期中被呼叫,並傳入 CurlHandle 物件、包含除錯訊息類型的整數和包含除錯訊息的字串。除錯訊息類型是以下常數之一:

一旦設定此選項,就不應設定 CURLINFO_HEADER_OUT,因為它使用相同的 libcurl 功能。

curl_getinfo() 現在會返回一個額外的 `posttransfer_time_us` 鍵,包含從開始到最後一個位元組發送所經過的微秒數。當發生重新導向時,每個請求的時間會加總在一起。也可以透過將 CURLINFO_POSTTRANSFER_TIME_T 傳遞給 curl_getinfo() 的 `option` 參數來取得此值。這需要 libcurl 8.10.0 或更高版本。

DOM

新增了 Dom 命名空間以及與現有 DOM 類別對應的新類別(例如 Dom\Node 是新的 DOMNode)。這些類別與 HTML 5 相容,並且符合 WHATWG 規範;解決了 DOM 擴充功能中長期存在的錯誤。舊的 DOM 類別仍然可用,以確保向下相容。

新增了 DOMNode::compareDocumentPosition() 以及其相關的常數:

現在可以將任何可呼叫物件傳遞給 DOMXPath::registerPhpFunctions()。此外,使用 DOMXPath::registerPhpFunctionNs(),現在可以註冊使用原生函數呼叫語法而不是使用 php:function('name') 的回呼函數。

Intl

新增了 NumberFormatter::ROUND_HALFODD 來補充現有的 NumberFormatter::ROUND_HALFEVEN 功能。

OpenSSL

新增了對基於 Curve25519 + Curve448 金鑰的支援。具體來說,openssl_pkey_new()openssl_pkey_get_details()openssl_sign()openssl_verify() 中支援 x25519、ed25519、x448 和 ed448 欄位,並已擴展以支援這些金鑰。

實作 PASSWORD_ARGON2 密碼雜湊演算法。需要 OpenSSL 3.2 和 NTS 建置。

PCRE (Perl Compatible Regular Expressions,Perl 相容正規表示式)

內建的 pcre2lib 已更新至 10.44 版。因此,新增了 LoongArch JIT 支援,現在允許在 Perl 相容項目的大括號之間使用空格,並且支援可變長度的回溯斷言。

在 pcre2lib 10.44 版中,命名擷取群組的最大長度已從 32 變更為 128

新增了對 r (PCRE2_EXTRA_CASELESS_RESTRICT) 修飾符以及 (?r) 模式修飾符的支援。當與不區分大小寫的修飾符 (i) 一起啟用時,表示式會鎖定 ASCII 和非 ASCII 字元的混合使用。

PDO (PHP Data Objects,PHP 資料物件)

新增了對驅動程式特定子類別的支援。此 RFC 為 PDO 新增了子類別,以便更好地支援資料庫特定的功能。可以透過呼叫 PDO::connect() 方法或直接實例化驅動程式特定子類別的實例來實例化新的類別。

新增了對驅動程式特定 SQL 解析器的支援。預設解析器支援:

  • 單引號和雙引號字面值,並以雙寫作為跳脫機制
  • 雙橫線和非巢狀 C 風格註解

PDO_MYSQL

新增了一個自定義解析器,支援:

  • 單引號和雙引號字面值,並以雙寫和反斜線作為跳脫機制
  • 反引號字面值識別符號,並以雙寫作為跳脫機制
  • 兩個橫線後接至少一個空白字元、非巢狀 C 風格註解和井字號 (hash) 註解

PDO_PGSQL

新增了一個自定義解析器,支援:

  • 單引號和雙引號字面值,並以雙寫作為跳脫機制
  • C 風格「跳脫」字串字面值 (E'string')
  • 美元符號引號字串字面值
  • 雙橫線和 C 風格註解(非巢狀)
  • 支援 ?? 作為 ? 運算子的跳脫序列

PDO_SQLITE

新增了一個自定義解析器,支援:

  • 單引號、雙引號和反引號字面值,並以雙寫作為跳脫機制
  • 使用方括號括住識別符號
  • 雙橫線和 C 風格註解(非巢狀)

Phar (PHP Archive,PHP 檔案)

新增了對 Zip 封存檔的 Unix 時間戳記擴充的支援。

Readline (讀取行)

新增了透過 PHP_HISTFILE 環境變數更改 .php_history 路徑的功能。

SOAP (簡易物件存取協定)

在類別映射中新增了對命名空間的 clark 標記法的支援。現在可以使用 clark 標記法在類別映射中指定項目,以將具有特定命名空間的類型解析為特定類別。例如:'{http://example.com}foo' => 'FooClass'

傳遞給 xsd:datetime 或類似元素的 DateTimeInterface 實例現在會被序列化為此類元素,而不是被序列化為空字串。

工作階段持續性現在可以與共用的工作階段模組一起使用。

標準

新增了一個新的 RoundingMode 列舉,與 PHP_ROUND_* 常數相比,它具有更清晰的命名和更好的可探索性。此外,還新增了四種新的捨入模式,這些模式只能透過新的 RoundingMode 列舉使用。

XSL (可擴展樣式表語言)

現在可以使用包含單引號和雙引號的參數。

現在可以將任何可呼叫的物件傳遞給 XSLTProcessor::registerPhpFunctions()

新增了 XSLTProcessor::$maxTemplateDepthXSLTProcessor::$maxTemplateVars 來控制 XSL 樣板評估的遞迴深度。

Zip

新增了 ZipArchive::ER_TRUNCATED_ZIP 常數,該常數在 libzip 1.11 中新增。

新增註記

使用者提供的註記

此頁面沒有使用者提供的註記。
To Top