PHP 8.5 新增管道運算子(Pipe Operator)

Back
Category : News

PHP 8.5 即將於今年十一月推出,這次將帶來一個備受期待的功能:管道運算子(|>)。這是一個看似簡單的小功能,但其潛力卻是巨大的,雖然花了多年的時間才實現。

管道運算子的用途在於,它將左側的值作為唯一的參數傳遞給右側的函數(在 PHP 中是可調用的)。例如,使用管道運算子的代碼如下:

$result = "Hello World" |> strlen(...);

這段代碼的效果等同於:

$result = strlen("Hello World");

這樣的寫法雖然單獨看起來並不引人注目,但當它與其他管道運算子連接時,便形成了一個「管道」,這樣的特性使得代碼變得更加簡潔。例如,以下是一段實際項目的代碼,使用管道運算子重寫後:

$arr = [ new Widget(tags: ['a', 'b', 'c']), new Widget(tags: ['c', 'd', 'e']), new Widget(tags: ['x', 'y', 'a']), ];

這段代碼使用管道運算子後,變得更加易讀:

$result = $arr |> fn($x) => array_column($x, 'tags') |> fn($x) => array_merge(...$x) |> array_unique(...) |> array_values(...);

在沒有管道運算子的情況下,這段代碼需要許多臃腫的嵌套,或者需要手動創建每個步驟的臨時變量。雖然臨時變量並不算糟糕,但它們會增加思維上的負擔,特別是在需要單行表達式的上下文中,如 match() 區塊。利用管道運算子,我們可以將這些代碼簡化到一行。

如果你曾在 Unix/Linux 命令行工作過,你會發現這個運算子與 shell 管道(|)有相似之處。這是故意的,因為它實際上就是將左側的輸出用作右側的輸入。

管道運算子在許多語言中都有出現,尤其是在函數式編程世界中。像 F# 和 OCaml 都有類似的運算子。Elixir 也有一個稍微複雜的版本。管道的故事與 Hack/HHVM 有關,這是 Facebook 的 PHP 分支。Hack 包含了許多 PHP 5 當時所不具備的功能,許多功能最終進入了後來的 PHP 版本。2016 年,PHP 貢獻者 Sara Golemon 提出了將 Hack 的管道運算子移植到 PHP 的提案。

隨著時間推移,PHP 的管道運算子終於在 2025 年得以實現。這次的實現經過了多次嘗試,最終在 PHP 基金會開發團隊的協助下,成功通過了。

總之,管道運算子不僅簡單,它的潛力無限。我們可以在許多地方使用它,從而簡化代碼並提高可讀性。未來還會有更多的功能增強,讓我們拭目以待!更多資訊可以參考 這裡