PHP 8.5 Pipe Operator เทียบกับ Laravel Collections

PHP 8.5 ได้เปิดตัว pipe operator ซึ่งนักพัฒนา Laravel ส่วนใหญ่ต่างก็มองข้ามมันไป เราใช้ collect()->filter()->map() กันมานานหลายปี และมันก็ทำงานได้ดี

ต่อมา Spatie ได้ปล่อย Piper ออกมา ซึ่งเป็นไลบรารีที่นำ helper สไตล์ Laravel มาใช้กับ pipe operator โดยใช้ฟังก์ชันแบบ standalone สำหรับ array และ string

Piper คือตัวแทนของ Collections หรือไม่? คำตอบคือ ไม่ เพราะมันถูกสร้างมาเพื่อวัตถุประสงค์ที่แตกต่างกัน

Where Piper wins

• Native values. Collections จะห่อหุ้มข้อมูลของคุณไว้ใน object ทำให้คุณต้องแปลง array เป็น collection และแปลงกลับไปกลับมา แต่ Piper ทำงานกับ array และ string แบบธรรมดา ข้อมูลที่ใส่เข้าไปเป็นแบบ native และผลลัพธ์ที่ออกมาก็เป็นแบบ native เช่นกัน

• Mixing functions. การเขียน chain ของ Collection จะเรียกได้เฉพาะ method ใน class Collection เท่านั้น แต่การเขียน pipe chain สามารถรับฟังก์ชันใดก็ได้ คุณสามารถผสมผสานทั้ง Piper helpers, ฟังก์ชันพื้นฐานของ PHP และฟังก์ชันที่คุณเขียนขึ้นเองเข้าด้วยกันใน flow เดียว

• Zero dependencies. Piper ไม่จำเป็นต้องใช้ Laravel framework ทำให้มันเหมาะอย่างยิ่งสำหรับผู้สร้าง package ที่ต้องการโค้ดที่สะอาดโดยไม่มี dependency ที่หนักเกินไป

Where Collections win

• Feature depth. Collections มี method มากกว่า 100 แบบ เช่น groupBy() และ pluck() ในขณะที่ Piper มีเพียงฟังก์ชันที่ใช้บ่อยที่สุดเท่านั้น

• Lazy evaluation. LazyCollections สามารถจัดการกับชุดข้อมูลขนาดใหญ่ได้โดยใช้หน่วยความจำต่ำ แต่ Piper จะสร้าง array ใหม่ในทุกๆ ขั้นตอน ซึ่งอาจทำให้แอปของคุณช้าลงเมื่อต้องจัดการกับข้อมูลจำนวนมาก

• Ecosystem fit. Eloquent จะคืนค่าเป็น Collections และ Query builders ก็คืนค่าเป็น Collections การฝืนใช้ framework เพื่อจะใช้ Piper มักจะสร้างงานเพิ่มขึ้นโดยไม่จำเป็น

• Discoverability. IDE ของคุณจะแสดงทุก method เมื่อคุณพิมพ์เครื่องหมายขีดหลัง Collection แต่สำหรับ Piper คุณต้องทำการ import ทุกฟังก์ชันด้วยตัวเอง

The Big Catch

คุณต้องใช้ PHP 8.5 เนื่องจากเซิร์ฟเวอร์ที่ใช้งานจริงส่วนใหญ่ยังคงใช้เวอร์ชัน 8.2 หรือ 8.4 หากคุณยังไม่ได้ใช้ 8.5 Piper ก็ยังไม่มีประโยชน์สำหรับคุณในตอนนี้

Adoption Tips

ใช้ Piper หากคุณเขียน package หรือโค้ดที่ไม่ยึดติดกับ framework (framework-agnostic) และใช้เมื่อคุณต้องการแปลง native array โดยไม่อยากรับภาระ (overhead) จากการใช้ object

ใช้ Collections ต่อไปภายในแอป Laravel ของคุณ เพราะมันถูกรวมเข้ากับระบบอย่างสมบูรณ์ ทรงพลัง และเป็นสิ่งที่ทีมของคุณคาดหวัง

Piper ไม่ใช่ตัวแทนของ Collections แต่มันคือเครื่องมือสำหรับเติมเต็มช่องว่างระหว่างโปรเจกต์ต่างๆ

Source: https://dev.to/hafiz619/php-85s-pipe-operator-vs-laravel-collections-where-piper-fits-and-where-it-doesnt-1bkl