Eine Bibliothek, die eine Reihe minimalistischer, typisierter und weitergeleiteter unveränderlicher Sammlungen für PHP bereitstellt.
PHP > 7.2
composer require dcsg/php-immutable-collections
Das Fehlen von Generics in PHP erlaubt keine typisierten Sammlungen in PHP.
Diese Bibliothek bietet zwei abstrakte unveränderliche Sammlungen:
Da PHP nicht wie Java über Generics verfügt, ist es nicht möglich, nativ typisierte Sammlungen zu haben. Die in dieser Bibliothek verfügbaren Sammlungen bilden die Grundlage für die Erstellung Ihrer eigenen typisierten Sammlungen. Sie müssen sie nur erweitern.
Bei DDD geht es darum, dass Ihr Code die Geschäftssprache spricht, die sogenannte Ubiquitous Language. Ohne Sammlungen in PHP ist dies mit Arrays
sehr schwer zu erreichen, da Sie ihnen kein Verhalten hinzufügen können. Was normalerweise passiert, ist, dass Sie dieses Verhalten zu Ihrer Entität hinzufügen, aber es sollte nicht vorhanden sein. Ein weiteres Problem ist die Veränderlichkeit von Arrays
. VOs
(Value Objects) MÜSSEN immer unveränderlich sein und das ist bei Arrays
unmöglich und Sie sollten immer garantieren, dass die elements
dieses Array
alle vom gleichen Typ sind.
Collections
und Arrays
stellen beide eine Gruppe von Elementen dar.Collections
werden von PHP nicht nativ unterstützt, Arrays
hingegen schon.Arrays
sind DIE Datenstruktur von PHP und werden für fast alles verwendet.Arrays
können Sie kein neues Verhalten hinzufügen, während Collections
dies zulassen.Arrays
ist es nicht möglich, einen Typ für seine Elemente zu definieren, während bei Collections
dies möglich ist. Es gibt noch andere Sammlungen für PHP, zum Beispiel Doctrine Collections und Illuminate Collections. Diese Sammlungen lösen unterschiedliche Probleme, sind auf ihren spezifischen Anwendungsfall zugeschnitten und ihre APIs sind umfangreich. Noch wichtiger ist, dass diese Sammlungen veränderbar sind. Diese Kombinationen erschweren die Verwendung dieser Sammlungen für einfachere Anwendungsfälle. Aus diesem Grund verfügen die hier bereitgestellten Sammlungen über eine sehr kleine API und stellen nicht einmal die Iterator-API zur Verfügung. Auf diese Weise haben Sie die Möglichkeit, diese zu nutzen und das Verhalten maßgeschneidert auf Ihre Bedürfnisse zu erweitern.
isEmpty
“, count
, toArray
“, contains
“, get
“, „ map
“, filter
, slice
“, merge
“, reverse
, reduce
, „ first
, last
, head
und „ 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
Zum besseren Verständnis stellen wir zwei einfache Beispiele vor. Eine bezog sich auf Rechnungen und eine andere auf die Beine eines Frachtschiffs.
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
$ composer test
Weitere Informationen finden Sie unter BEITRAGEN und VERHALTENSKODEX.
Wenn Sie sicherheitsrelevante Probleme entdecken, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.