Um pacote de coleção que pode ser estendido para implementar coisas como um contêiner de injeção de dependência, objetos RecordSet para armazenar registros de banco de dados, um pacote de cookies http ou, tecnicamente, qualquer coleção de itens que possam ser repetidos e cujos itens possam ser acessados usando array -sintaxe de acesso ou sintaxe de propriedade do objeto.
Você pode:
Este pacote fornece digitação estrita opcional de itens de coleção e busca 100% de cobertura de testes unitários.
Via compositor: (Requer PHP 7.4+ ou PHP 8.0+).
Mude para a ramificação 3.X para ler a documentação da versão 3.X.
Mude para a ramificação 4.X para ler a documentação da versão 4.X.
Mude para a ramificação 5.x para ler a documentação da versão 5.x.
Mude para o branch master para ler a documentação da versão mais recente.
composer require rotexsoft/versatile-collections
Se você deseja simplesmente armazenar itens do mesmo tipo ou de tipos diferentes em uma coleção, basta usar a classe GenericCollection da seguinte forma:
<?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
Você também pode fazer com que qualquer classe em seu aplicativo se comporte exatamente como VersatileCollectionsGenericCollection implementando VersatileCollectionsCollectionInterface e usando VersatileCollectionsCollectionInterfaceImplementationTrait nessas classes.
Se você deseja impor a digitação estrita, as seguintes classes Collection são fornecidas neste pacote:
Para implementar uma coleção personalizada que contém apenas objetos que são instâncias de uma classe específica (por exemplo PDO ), sua classe de coleção personalizada deve atender aos seguintes requisitos:
Sua classe de coleção personalizada deve implementar VersatileCollectionsStrictlyTypedCollectionInterface que atualmente contém os métodos abaixo:
$item
for do tipo esperado ou falso caso contrárioSua classe de coleção personalizada deve usar VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait (que contém a implementação dos métodos em VersatileCollectionsStrictlyTypedCollectionInterface ). Se você optar por não usar VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait , então você terá que implementar todos os métodos especificados em VersatileCollectionsStrictlyTypedCollectionInterface e certifique-se de chamar o método checkType(mixed $item) em cada método onde você adiciona ou modifica itens na coleção, como offsetSet($key, $val) e lança um Exceção VersatileCollectionsExceptionsInvalidItemException sempre que checkType(mixed $item) retorna falso. Se você usar VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait em sua classe de coleção personalizada, mas adicionar novos métodos que também adicionam itens ou modificam itens na coleção, você pode usar o método auxiliar isRightTypeOrThrowInvalidTypeException($item, $calling_functions_name) fornecido em VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait para validar itens (isso lançará automaticamente uma exceção para você se o item que você está validando for do tipo errado; consulte VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait::offsetSet($key, $val) para obter um exemplo de como esse método auxiliar deve ser usado).
Opcionalmente, você pode substituir StrictlyTypedCollectionInterfaceImplementationTrait::__construct(mixed ...$arr_objs) por um construtor com a mesma assinatura, mas com o tipo específico. Por exemplo, __construct(PDO ...$pdo_objs) garante que apenas instâncias de PDO possam ser injetadas no construtor por meio da descompactação de argumentos.
O exemplo de código abaixo mostra como uma classe de coleção personalizada chamada PdoCollection , que armazena apenas itens que são instâncias de PDO , pode ser implementada:
<?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);
}
}
Você pode declarar suas classes de coleção digitadas personalizadas como finais para que os usuários de suas classes não possam estendê-las e, assim, contornar a verificação de tipo aplicada no momento da construção e na adição do item.
NOTA: Se você deseja armazenar apenas itens que são apenas instâncias de uma classe específica ou suas subclasses em uma coleção e não deseja criar uma classe de coleção personalizada para esse propósito, basta usar SpecificObjectsCollection
Glossário de métodos por categoria
Descrições de métodos com exemplos
Coleções genéricas
Coleções estritamente digitadas
Equivalência de métodos de coleta do Laravel
Envie um problema ou uma solicitação pull se encontrar algum problema com a documentação.