文章摘要
PHP 8.5将于今年11月发布,引入备受期待的管道操作符(|>)。该操作符将左侧的值作为参数传递给右侧的可调用函数,简化了代码的链式调用,尤其在处理复杂数据流时能显著提升代码的可读性和简洁性。
文章总结
PHP 8.5 新增管道操作符:意义与影响
PHP 8.5 将于今年11月发布,其中一个备受期待的新特性是管道操作符(|>)。虽然这个操作符看似简单,但其潜力巨大,且经过多年讨论才得以实现。
什么是管道操作符?
管道操作符 |> 的作用是将左侧的值作为参数传递给右侧的函数(或可调用对象)。例如:
php
$result = "Hello World" |> strlen(...);
这等同于:
php
$result = strlen("Hello World");
虽然单独使用并不显眼,但当它被重复或链式调用时,便形成了“管道”,能够显著简化代码。例如:
```php
$arr = [
new Widget(tags: ['a', 'b', 'c']),
new Widget(tags: ['c', 'd', 'e']),
new Widget(tags: ['x', 'y', 'a']),
];
$result = $arr
|> fn($x) => arraycolumn($x, 'tags')
|> fn($x) => arraymerge(...$x)
|> arrayunique(...)
|> arrayvalues(...);
同样的逻辑,若不用管道操作符,代码会变得冗长且难以维护:
php
arrayvalues(arrayunique(arraymerge(...arraycolumn($arr, 'tags'))));
``
管道操作符的引入不仅减少了临时变量的使用,还使得代码可以在单表达式上下文中使用,例如match()` 块。
管道操作符的起源
管道操作符在许多语言中都有出现,尤其是在函数式编程语言中,如 F#、OCaml 和 Elixir。PHP 的管道操作符灵感部分来自 Facebook 的 Hack/HHVM,后者在 PHP 5 时代引入了许多先进特性。2016 年,Sara Golemon 曾提议将 Hack 的管道操作符移植到 PHP,但由于语法复杂,该提议未能通过。
2020 年,随着函数式编程在 PHP 中的兴起,管道操作符的讨论再次被提起。尽管部分功能应用(PFA)的提议因引擎复杂性未能通过,但 PHP 8.5 最终引入了管道操作符,并得到了 PHP 基金会开发团队的支持。
管道操作符的潜力
管道操作符的引入不仅仅是语法糖,它还能与其他特性结合,发挥更大的作用。例如,在 match() 表达式中使用管道操作符,可以显著简化代码:
```php
$string = 'something GoesHERE';
$newString = match ($format) {
'snakecase' => $string
|> splitString(...)
|> fn($x) => implode('', $x)
|> strtolower(...),
'lowerCamel' => $string
|> splitString(...),
|> fn($x) => arraymap(ucfirst(...), $x)
|> fn($x) => implode('', $x)
|> lcfirst(...),
};
此外,管道操作符还可以与返回 `Closure` 的函数结合使用,进一步扩展其功能。例如:
php
$profit = [1, 4, 5]
|> loadSeveral(...)
|> filter(isOnSale(...))
|> map(sellWidget(...))
|> arraysum(...);
```
管道操作符的灵活性使其接近于 Kotlin 和 C# 中的“扩展函数”特性,允许开发者将独立函数以方法的形式调用。
未来展望
尽管管道操作符的引入是一个重要里程碑,但 PHP 的开发并未止步。目前有两个相关的 RFC 正在讨论中: 1. 部分功能应用(PFA):该特性旨在将多参数函数转换为单参数函数,以便更好地与管道操作符结合使用。 2. 函数组合操作符:该操作符允许将两个函数组合成一个新函数,进一步优化代码。
这些新特性有望在未来的 PHP 版本中实现,为开发者提供更多工具来编写简洁高效的代码。
总结
管道操作符的引入是 PHP 8.5 中的一项重要改进,它不仅简化了代码,还为函数式编程提供了更多可能性。随着后续特性的引入,PHP 的功能将进一步增强,为开发者带来更多便利。
(特别感谢 PHP 基金会团队的 Ilija Tovilo 和 Arnaud Le Blanc 对管道操作符实现的支持。)
评论总结
评论内容总结:
对管道操作符的期待与不满
- 一些开发者对PHP引入管道操作符表示欢迎,认为它使代码更易读。
- "I love the pipe operator... It's so much easier to reason about." (评论13)
- "I like it... Now they are at least chainable." (评论4)
- 但也有开发者认为其语法复杂,不如扩展方法或对象链式调用直观。
- "feels much more complex than writing... having array extension methods." (评论2)
- "The syntax is ugly as hell." (评论15)
- 一些开发者对PHP引入管道操作符表示欢迎,认为它使代码更易读。
与其他语言的比较
- 开发者提到其他语言(如Kotlin、C#、Raku)的类似功能,认为PHP的实现不够优雅。
- "I really would prefer extensions / extension functions (like in Kotlin)." (评论2)
- "raku has had feed operators like this since its inception." (评论3)
- 开发者提到其他语言(如Kotlin、C#、Raku)的类似功能,认为PHP的实现不够优雅。
对PHP标准库的批评
- 许多评论指出PHP标准库的不一致性,认为应先解决这些问题。
- "The stdlib is so inconsistent this will be a nightmare." (评论6)
- "PHP devs should instead FIRST focus on full unicode support." (评论6)
- 许多评论指出PHP标准库的不一致性,认为应先解决这些问题。
技术限制与改进建议
- 管道操作符存在技术限制,如参数顺序和单参数要求。
- "A major limitation of the pipe operator is that all the callables in the chain must accept only one required parameter." (评论11)
- 有开发者建议将类型伪对象化以简化操作。
- "Why not just make types psuedo-objects?" (评论9)
- 管道操作符存在技术限制,如参数顺序和单参数要求。
对PHP未来的期待
- 部分开发者对PHP的未来持乐观态度,认为其可能取代JS。
- "This will be the year of PHP. People are tired of JS." (评论14)
- 但也有开发者认为PHP需要更多根本性改进。
- "Why doesn't PHP remove the horrid $ symbol for variables?" (评论7)
- 部分开发者对PHP的未来持乐观态度,认为其可能取代JS。
总结:评论中对PHP引入管道操作符的看法褒贬不一,开发者对其语法、技术限制和PHP标准库的不一致性提出了批评,同时也期待PHP未来能有更多改进。