今天看到的新聞
今天看到 PHP 官方在八月中已經放出 PHP 8.6 的 Beta 1,目前整個 release 排程是 Beta 2(8/27)、Beta 3(9/10)、RC1(9/24),預計今年 11/19 正式 GA。這一版比較受矚目的幾個東西:
- Partial Function Application(PFA):可以只先帶部分參數給一個 function,產生一個新的 closure,等之後再把剩下的參數補上再呼叫。搭配 PHP 8.5 才剛加進來的 pipe operator
|>用起來特別順手,因為 pipe operator 規定串起來的每個 callable 都只能吃一個參數。 - 原生
Io\PollAPI:內建的 I/O 多工(multiplexing)機制,不用再靠第三方擴充套件去處理多個 I/O 來源。 Time\Duration類別:專門用來表示時間長度的物件,跟現有的DateTime系列做區隔。- 更嚴格的錯誤處理:以前很多「型別轉換時資料被默默截斷」的情況,現在會直接丟
ValueError或TypeError,不會再讓你不知不覺吃到一個被砍過的數字或字串。 - Session 安全預設值提升:
session.use_strict_mode跟session.cookie_httponly之後預設就是開啟。
為什麼我這個寫 Laravel 的後端工程師會在意這則新聞
先講最實際的:那個「更嚴格的錯誤處理」對我來說反而是最有感的一項,因為它動到的是「以前會安靜放過的錯誤」。舉個常見情境,Laravel 專案裡把使用者輸入丟進某個計算或格式化流程,過去如果型別對不上,PHP 可能默默幫你截斷或轉型,程式照跑,但結果是錯的——這種 bug 最難抓,因為它不會噴例外,只會在某個角落產生出一筆看起來正常、實際上是錯的資料。PHP 8.6 把這類情況改成直接丟 ValueError/TypeError,等於是把「隱性的錯誤」變成「顯性的例外」,這跟我們平常在 API 層做 request validation 的邏輯是同一個精神:與其讓錯誤資料流進系統深處某天才爆炸,不如讓它在最早的地方就噴出來。
第二個讓我在意的是 PFA 加 pipe operator 這個組合。老實說,Laravel 裡面本來就已經有 pipeline() 這種類似串接處理的寫法(例如中介層那種一路 pipe 下去的模式),但那個是框架層級提供的抽象。現在如果 PHP 語言本身就原生支援「函式局部套用 + 管道串接」,代表以後即使不靠框架的 Pipeline 類別,也能用更貼近語言原生語法的方式寫出一串「資料依序流過多個轉換函式」的邏輯,可讀性應該會比一層一層巢狀呼叫好上不少。不過這也代表要重新習慣一種寫法,畢竟平常寫 Laravel controller 或 service layer 已經很習慣物件導向那一套,要轉去想「怎麼把邏輯拆成一串可以局部套用的純函式」,多少需要一點心態上的調整。
結語
目前還在 Beta 階段,GA 要等到 11 月,離真正能在 production 專案升級還有一段時間,而且升級前勢必要先確認手上用的套件(尤其是一些依賴舊有型別轉換行為的 library)會不會因為錯誤處理變嚴格而炸開。但這種「語言層級主動收緊安全網」的方向,我覺得是值得先筆記起來的,等 RC 出來後應該會找時間拉一個測試分支實際跑跑看。