ไลบรารีที่จัดเตรียมชุดคอลเลกชันที่ไม่เปลี่ยนรูปแบบเรียบเรียงและแบบไพพ์สำหรับ PHP
PHP > 7.2
composer require dcsg/php-immutable-collections
การไม่มี Generics ใน PHP ไม่อนุญาตให้มีการพิมพ์คอลเลกชันใน PHP
ไลบรารีนี้มีคอลเลกชันนามธรรมที่ไม่เปลี่ยนรูปสองชุด:
เนื่องจาก PHP ไม่มี Generics เหมือนกับ Java จึงเป็นไปไม่ได้ที่จะมีคอลเลกชันที่พิมพ์แบบเนทิฟ คอลเลกชันที่มีอยู่ในไลบรารีนี้เป็นรากฐานสำหรับคุณในการสร้างคอลเลกชันประเภทของคุณเอง คุณเพียงแค่ต้องขยายคอลเลกชันเหล่านั้น
DDD เป็นเรื่องเกี่ยวกับการทำให้โค้ดของคุณพูดภาษาธุรกิจที่เรียกว่า Ubiquitous Language หากไม่มีคอลเลกชันใน PHP การใช้ Arrays
จะเป็นเรื่องยากมากเพราะคุณไม่สามารถเพิ่มลักษณะการทำงานให้กับพวกมันได้ ดังนั้นสิ่งที่มักจะเกิดขึ้น คุณเพิ่มพฤติกรรมนั้นให้กับเอนทิตีของคุณ แต่ไม่ควรอยู่ที่นั่น ปัญหาอีกประการหนึ่งคือความไม่แน่นอนของ Arrays
, VOs
(Value Objects) จะต้อง ไม่เปลี่ยนรูป เสมอและเป็นไปไม่ได้กับ Arrays
และคุณควรรับประกันเสมอว่า elements
ของ Array
นั้นล้วนเป็นประเภทเดียวกัน
Collections
และ Arrays
เป็นตัวแทนของกลุ่มองค์ประกอบCollections
โดยกำเนิดในขณะที่ Arrays
รองรับArrays
เป็นโครงสร้างข้อมูลของ PHP และใช้สำหรับเกือบทุกอย่างArrays
ไม่อนุญาตให้คุณเพิ่มลักษณะการทำงานใหม่ในขณะที่ Collections
อนุญาตArrays
ไม่อนุญาตให้คุณกำหนด ประเภท ขององค์ประกอบในขณะที่ Collections
อนุญาต มีคอลเลกชั่นอื่นๆ สำหรับ PHP ให้เลือกบ้าง เรามี Doctrine Collections และ Illuminate Collections คอลเลกชันเหล่านั้นช่วยแก้ปัญหาที่แตกต่างกัน ได้รับการปรับแต่งให้เหมาะกับกรณีการใช้งานเฉพาะ และ API ของคอลเลกชันนั้นกว้างขวางและที่สำคัญกว่านั้นคือคอลเลกชันเหล่านั้นสามารถเปลี่ยนแปลงได้ การผสมผสานเหล่านี้ทำให้ยากต่อการใช้คอลเลกชันเหล่านั้นเพื่อกรณีการใช้งานที่เรียบง่ายยิ่งขึ้น นั่นเป็นสาเหตุที่คอลเลกชันที่เรานำเสนอที่นี่ มี API ที่เล็กมาก และไม่เปิดเผย Iterator API ด้วยซ้ำ ด้วยวิธีนี้ คุณจะมีโอกาสใช้สิ่งเหล่านี้และขยายลักษณะการทำงานที่ปรับให้เหมาะกับความต้องการของคุณ
isEmpty
, count
, toArray
, contains
, get
, map
, filter
, slice
, merge
, reverse
, reduce
, first
, last
, head
, tail
<?php declare (strict_types= 1 );
use DCSG ImmutableCollections ImmutableCollection ;
final class MyStringCollection extends ImmutableCollection {
protected function validateItems ( array $ elements ): void
{
foreach ( $ elements as $ element ) {
if (! is_string ( $ element )) {
throw new InvalidArgumentException ( ' Element is not a String. ' );
}
}
}
}
$ collection = MyStringCollection:: create ([ ' foo ' , ' bar ' ]);
echo $ collection -> count (); // 2
$ slicedCollection = $ collection -> slice ( 0 , 1 ); // MyStringCollection { $elements=['foo']}
<?php declare (strict_types= 1 );
use DCSG ImmutableCollections SetImmutableCollection ;
final class MyStringSetCollection extends SetImmutableCollection {
protected function validateItems ( array $ elements ): void
{
foreach ( $ elements as $ element ) {
if (! is_string ( $ element )) {
throw new InvalidArgumentException ( ' Element is not a String. ' );
}
}
}
}
$ collection = MyStringSetCollection:: create ([ ' foo ' , ' bar ' ]);
echo $ collection -> count (); // 2
$ slicedCollection = $ collection -> tail (); // MyStringSetCollection { $elements=['bar']}
$ collection = MyStringSetCollection:: create ([ ' foo ' , ' bar ' , ' foo ' ]); // Throws InvalidArgumentException
เรามีตัวอย่างง่ายๆ สองตัวอย่างเพื่อความเข้าใจที่ดีขึ้น เรื่องหนึ่งเกี่ยวข้องกับใบแจ้งหนี้และอีกเรื่องเกี่ยวกับขาของเรือบรรทุกสินค้า
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เปลี่ยนแปลงเมื่อเร็วๆ นี้
$ composer test
โปรดดูรายละเอียดที่การมีส่วนร่วมและจรรยาบรรณ
หากคุณพบปัญหาที่เกี่ยวข้องกับความปลอดภัย โปรดส่งอีเมลถึง [email protected] แทนการใช้ตัวติดตามปัญหา
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม