Un package de collection qui peut être étendu pour implémenter des éléments tels qu'un conteneur d'injection de dépendances, des objets RecordSet pour héberger les enregistrements de base de données, un sac de cookies http ou, techniquement, toute collection d'éléments pouvant être bouclés et dont chacun est accessible à l'aide d'un tableau. -syntaxe d'accès ou syntaxe de propriété d'objet.
Tu peux:
Ce package fournit un typage strict facultatif des éléments de collection et vise une couverture de tests unitaires à 100 %.
Via composer : (Nécessite PHP 7.4+ ou PHP 8.0+).
Basculez vers la branche 3.X pour lire la documentation de la version 3.X.
Basculez vers la branche 4.X pour lire la documentation de la version 4.X.
Basculez vers la branche 5.x pour lire la documentation de la version 5.x.
Basculez vers la branche master pour lire la documentation de la dernière version.
composer require rotexsoft/versatile-collections
Si vous cherchez simplement à stocker des éléments de types identiques ou différents dans une collection, vous pouvez simplement utiliser la classe GenericCollection comme ceci :
<?php
use VersatileCollections GenericCollection ;
// items to be stored in your collection
$ item1 = [ ' yabadoo ' ]; // an array
$ item2 = function (){ echo ' Hello World! ' ; }; // a callable
$ item3 = 777.888 ; // a float
$ item4 = 777 ; // an int
$ item5 = new stdClass (); // an object
$ item6 = new ArrayObject ([]); // another object
$ item7 = tmpfile (); // a resource
$ item8 = true ; // a boolean
$ item9 = " true " ; // a string
// Technique 1: pass the items to the constructor of the collection class
$ collection = new VersatileCollections GenericCollection (
$ item1 , $ item2 , $ item3 , $ item4 , $ item5 , $ item6 , $ item7 , $ item8 , $ item9
);
// Technique 2: pass the items in an array using argument unpacking
// to the constructor of the collection class
$ collection = new GenericCollection (
...[ $ item1 , $ item2 , $ item3 , $ item4 , $ item5 , $ item6 , $ item7 , $ item8 , $ item9 ]
);
// Technique 3: pass the items in an iterable (such as an array) to the static makeNew helper method
// available in all collection classes
$ collection = GenericCollection:: makeNew (
[ $ item1 , $ item2 , $ item3 , $ item4 , $ item5 , $ item6 , $ item7 , $ item8 , $ item9 ]
);
// Technique 4: create an empty collection object and subsequently add each
// item to the collection via array assignment syntax or object
// property assignment syntax or using the appendItem($item),
// prependItem($item, $key=null), push($item) or put($key, $value)
// methods
$ collection = new GenericCollection (); // empty collection
// OR
$ collection = GenericCollection:: makeNew (); // empty collection
$ collection [] = $ item1 ; // array assignment syntax without key
// the item is automatically assigned
// the next available integer key. In
// this case 0
$ collection [] = $ item2 ; // array assignment syntax without key
// the next available integer key in this
// case is 1
$ collection [ ' some_key ' ] = $ item3 ; // array assignment syntax with specified key `some_key`
$ collection -> some_key = $ item4 ; // object property assignment syntax with specified property
// `some_key`. This will update $collection['some_key']
// changing its value from $item3 to $item4
$ collection -> appendItem ( $ item3 ) // same effect as:
-> appendItem ( $ item5 ); // $collection[] = $item3;
// $collection[] = $item5;
// Adds an item to the end of the collection
// You can chain the method calls
$ collection -> prependItem ( $ item6 , ' new_key ' ); // adds an item with the optional
// specified key to the front of
// collection.
// You can chain the method calls
$ collection -> push ( $ item7 ); // same effect as:
// $collection[] = $item7;
// Adds an item to the end of the collection
// You can chain the method calls
$ collection -> put ( ' eight_item ' , $ item8 ) // same effect as:
-> put ( ' ninth_item ' , $ item9 ); // $collection['eight_item'] = $item8;
// $collection['ninth_item'] = $item9;
// Adds an item with the specified key to
// the collection. If the specified key
// already exists in the collection the
// item previously associated with the
// key is overwritten with the new item.
// You can chain the method calls
Vous pouvez également faire en sorte que n'importe quelle classe de votre application se comporte exactement comme VersatileCollectionsGenericCollection en implémentant VersatileCollectionsCollectionInterface et en utilisant VersatileCollectionsCollectionInterfaceImplementationTrait dans ces classes.
Si vous souhaitez appliquer un typage strict, les classes Collection suivantes sont fournies dans ce package :
Pour implémenter une collection personnalisée qui contient uniquement des objets qui sont des instances d'une classe spécifique (par exemple PDO ), votre classe de collection personnalisée doit respecter les exigences suivantes :
Votre classe de collection personnalisée doit implémenter VersatileCollectionsStrictlyTypedCollectionInterface qui contient actuellement les méthodes ci-dessous :
$item
est du type attendu ou false sinonVotre classe de collection personnalisée doit utiliser VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait (qui contient l'implémentation des méthodes dans VersatileCollectionsStrictlyTypedCollectionInterface ). Si vous choisissez de ne pas utiliser VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait , vous devrez alors implémenter toutes les méthodes spécifiées dans VersatileCollectionsStrictlyTypedCollectionInterface et assurez-vous d'appeler la méthode checkType(mixed $item) dans chaque méthode où vous ajoutez ou modifiez des éléments. dans la collection telle que offsetSet($key, $val) et lancez un Exception VersatileCollectionsExceptionsInvalidItemException chaque fois que checkType (mixed $item) renvoie false. Si vous utilisez VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait dans votre classe de collection personnalisée mais que vous ajoutez de nouvelles méthodes qui ajoutent ou modifient également des éléments dans la collection, vous pouvez utiliser la méthode d'assistance isRightTypeOrThrowInvalidTypeException($item, $calling_functions_name) fournie dans VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait pour valider les éléments. (il lancera automatiquement un exception pour vous si l'élément que vous validez est du mauvais type ; voir VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait::offsetSet($key, $val) pour un exemple de la façon dont cette méthode d'assistance doit être utilisée).
Vous pouvez éventuellement remplacer StrictlyTypedCollectionInterfaceImplementationTrait::__construct(mixed ...$arr_objs) par un constructeur avec la même signature mais avec le type spécifique. Par exemple, __construct(PDO ...$pdo_objs) garantit que seules les instances de PDO peuvent être injectées dans le constructeur via le déballage des arguments.
L'exemple de code ci-dessous montre comment une classe de collection personnalisée appelée PdoCollection , qui stocke uniquement les éléments qui sont des instances de PDO , peut être implémentée :
<?php
use VersatileCollections StrictlyTypedCollectionInterface ;
class PdoCollection implements StrictlyTypedCollectionInterface { //1. Implement interface
use VersatileCollections StrictlyTypedCollectionInterfaceImplementationTrait; //2. Use trait
public function __construct ( PDO ... $ pdo_objs ) { //3. Optionally override the constructor with a type
// specific one
$ this -> versatile_collections_items = $ pdo_objs ;
}
/**
*
* @return bool true if $item is of the expected type, else false
*
*/
public function checkType ( mixed $ item ): bool { //4. implement interface methods not implemented in trait above
return ( $ item instanceof PDO );
}
/**
*
* @return string|array a string or array of strings of type name(s)
* for items acceptable in instances of this
* collection class
*
*/
public function getTypes (): VersatileCollections StringsCollection { //4. implement interface methods not implemented in trait above
return new VersatileCollections StringsCollection ( PDO ::class);
}
}
Vous pouvez déclarer vos classes de collection typées personnalisées comme finales afin que les utilisateurs de vos classes ne puissent pas les étendre et ainsi contourner la vérification de type appliquée au moment de la construction et au moment de l'ajout d'éléments.
REMARQUE : Si vous souhaitez uniquement stocker des éléments qui ne sont que des instances d'une classe spécifique ou de ses sous-classes dans une collection et que vous ne souhaitez pas créer une classe de collection personnalisée à cet effet, utilisez simplement SpecificObjectsCollection.
Glossaire des méthodes par catégorie
Descriptions des méthodes avec exemples
Collections génériques
Collections strictement typées
Équivalence des méthodes de collecte Laravel
Veuillez soumettre un problème ou une pull request si vous rencontrez des problèmes avec la documentation.