PHP 8.5 管道运算符 vs Laravel Collections
PHP 8.5 引入了管道运算符。大多数 Laravel 开发者忽略了它。多年来,我们一直使用 collect()->filter()->map()。它运行良好。
随后,Spatie 发布了 Piper。这是一个将 Laravel 风格的辅助函数引入管道运算符的库。它对数组和字符串使用独立函数。
Piper 是 Collections 的替代品吗?不是。它的用途不同。
Piper 的优势之处
• 原生值。Collections 会将你的数据封装在对象中。你必须在数组和集合之间进行转换。Piper 则直接处理普通的数组和字符串。输入是原生类型,输出也是原生类型。
• 混合函数。Collection 链只能调用 Collection 类上的方法。而管道链可以接受任何函数。你可以在一个流程中混合使用 Piper 辅助函数、PHP 原生函数以及你自定义的函数。
• 零依赖。Piper 不需要 Laravel 框架。这使得它非常适合那些想要保持代码简洁且不希望引入沉重依赖的包作者。
Collections 的优势之处
• 功能深度。Collections 拥有超过 100 个方法,例如 groupBy() 和 pluck()。Piper 仅包含最常用的方法。
• 惰性求值。LazyCollections 可以以低内存占用处理海量数据集。Piper 在每一步都会创建一个新数组。在处理大数据时,这可能会降低应用的运行速度。
• 生态契合度。Eloquent 返回的是 Collections。查询构建器返回的也是 Collections。为了使用 Piper 而去对抗框架,往往会增加额外的工作量。
• 可发现性。在 Collection 后面输入一个连字符时,你的 IDE 会显示所有可用方法。而使用 Piper 时,你必须手动导入每一个函数。
关键限制
你必须运行 PHP 8.5。大多数生产服务器仍在使用 8.2 或 8.4。如果你还没升级到 8.5,那么 Piper 目前对你来说毫无用处。
使用建议
如果你编写的是扩展包或与框架无关的代码,请使用 Piper。当你希望在不增加对象开销的情况下转换原生数组时,可以使用它。
在你的 Laravel 应用内部,请坚持使用 Collections。它们集成度高、功能强大,也是团队成员所习惯的。
Piper 不是替代品。它是填补项目间空白的工具。
