跳转到内容
Kewei Yan
返回

🚀 PHP 8.5 新特性:管道符 |> 终于来了,用过都说爽!

一句话总结:
|> 是“小语法,大能量”。它让你的代码像读自然语言一样流畅,彻底告别嵌套地狱。


💡 TL;DR(看这一节就够)


🧩 1. 它到底是什么?

语法一眼就懂:

$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(...);

// 结果:['a','b','c','d','e','x','y']

对比没有管道时的写法:

array_values(array_unique(array_merge(...array_column($arr,'tags'))));

是不是瞬间“读不下去”?
有了 |>,这类“流水线式”的逻辑终于能自然顺眼地写出来。


🧠 2. 和命令行的 | 有点像?

是的,思想一致:左边的输出就是右边的输入。
不同的是,PHP 的管道右侧是 callable,搭配 (... ) 的一等可调用语法,非常顺手。


🕰️ 3. 为什么现在才有?

简单回顾一下历程:


⚙️ 4. 不止“更好看”:它能叠加增益!

✅ 在 match 中更优雅

$newString = match ($format) {
  'snake_case' => $string
      |> splitString(...)
      |> fn($x) => implode('_', $x)
      |> strtolower(...),

  'lowerCamel' => $string
      |> splitString(...)
      |> fn($x) => array_map(ucfirst(...), $x)
      |> fn($x) => implode('', $x)
      |> lcfirst(...),
};

单表达式写法,逻辑顺、无中间变量,看得也舒服。


✅ 像扩展方法一样链式写

如果右边是返回闭包的函数,就能像扩展方法一样继续链下去。
更自由,不局限于语言内置方法。


✅ “空值安全”的 Maybe 风格

function maybe(\Closure $c): \Closure {
  return fn(mixed $arg) => $arg === null ? null : $c($arg);
}

$profit = [1,4,5]
  |> maybe(loadSeveral(...))
  |> maybe(filter(isOnSale(...)))
  |> maybe(map(sellWidget(...)))
  |> maybe(array_sum(...));

这几行其实就是一个迷你版的 Maybe Monad,让整条链天然空值安全。


🧩 5. 和“标量方法”有啥不同?

两者目标相似:都让链式处理更顺滑。
区别在于:


⚠️ 6. 有哪些注意点?


🔭 7. 接下来:PFA 与函数组合操作符

some_func(?, 5, ?, 3)

它将和 |> 成为完美搭档。


🧰 8. 落地建议(给团队)

  1. 优先改写嵌套最深的 array_/str_ 表达式。
  2. 引入“函数工具箱”:如返回闭包的 map(fn) / filter(fn)
  3. 约定:带额外参数时用 fn($x) => ... 包裹,未来可替换为 PFA。
  4. 尽量在 match、三元、数组构造等场景保持“单表达式纯度”。
  5. 制作一页团队内部 Cheatsheet(旧写法 → 管道写法)。

🧮 9. 示例速记(可贴 Wiki)

数组统计:

$total = $orders
  |> fn($x) => array_map(getAmount(...), $x)
  |> array_sum(...);

字符串格式化:

$slug = $title
  |> trim(...)
  |> strtolower(...)
  |> fn($x) => preg_replace('/\s+/', '-', $x);

match 里的数据清洗:

$val = match(true) {
  $isCsv  => $raw |> parseCsv(...),
  $isJson => $raw |> json_decode(..., associative: true),
  default => [],
};

✍️ 最后一句话

|> 是 PHP 8.5 最值得尝试的新特性。
它让你的代码从“嵌套地狱”走向“语义流畅”,
是一次让 PHP 真正读起来像人话的进化。


📚 参考来源



分享这篇文章:

上一篇
Laravel Batch Job 的隐藏陷阱:deleteWhenMissingModels 会让 finally 回调失效
下一篇
PHP 实现支持权重的 array_rand 方法