Пакет сбора данных, который можно расширить для реализации таких вещей, как контейнер внедрения зависимостей, объекты RecordSet для размещения записей базы данных, набор файлов cookie http или технически любая коллекция элементов, которые можно зацикливать и к каждому из которых можно получить доступ с помощью массива. -синтаксис доступа или синтаксис свойств объекта.
Ты можешь:
Этот пакет обеспечивает дополнительную строгую типизацию элементов коллекции и обеспечивает 100 % покрытие модульными тестами.
Через композитор: (Требуется PHP 7.4+ или PHP 8.0+).
Перейдите в ветку 3.X, чтобы прочитать документацию по версии 3.X.
Перейдите в ветку 4.X, чтобы прочитать документацию по версии 4.X.
Перейдите в ветку 5.x, чтобы прочитать документацию по версии 5.x.
Перейдите в ветку master, чтобы прочитать документацию последней версии.
composer require rotexsoft/versatile-collections
Если вы просто хотите хранить элементы одного и того же или разных типов в коллекции, вы можете просто использовать класс GenericCollection следующим образом:
<?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
Вы также можете заставить любой класс в своем приложении вести себя точно так же, как VersatileCollectionsGenericCollection , реализовав VersatileCollectionsCollectionInterface и используя VersatileCollectionsCollectionInterfaceImplementationTrait в таких классах.
Если вы хотите обеспечить строгую типизацию, в этом пакете предусмотрены следующие классы Collection:
Чтобы реализовать пользовательскую коллекцию, содержащую только объекты, являющиеся экземплярами определенного класса (например , PDO ), ваш класс пользовательской коллекции должен соответствовать следующим требованиям:
Ваш пользовательский класс коллекции должен реализовывать VersatileCollectionsStrictlyTypedCollectionInterface , который в настоящее время содержит следующие методы:
$item
имеет ожидаемый тип, или false в противном случаеВаш пользовательский класс коллекции должен использовать VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait (который содержит реализацию методов в VersatileCollectionsStrictlyTypedCollectionInterface ). Если вы решите не использовать VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait , вам придется реализовать все методы, указанные в VersatileCollectionsStrictlyTypedCollectionInterface , и обязательно вызывать метод checkType(mixed $item) в каждом методе, в котором вы добавляете или изменяете элементы. в коллекции, например offsetSet($key, $val) и выдать Исключение VersatileCollectionsExceptionsInvalidItemException всякий раз, когда checkType(смешанный $item) возвращает false. Если вы используете VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait в своем пользовательском классе коллекции, но добавляете новые методы, которые также добавляют элементы в коллекцию или изменяют ее, вы можете использовать вспомогательный метод isRightTypeOrThrowInvalidTypeException($item, $calling_functions_name), представленный в VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait , чтобы проверять элементы (он автоматически выдает исключение, если проверяемый элемент имеет неправильный тип; см. VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait::offsetSet($key, $val) для примера того, как следует использовать этот вспомогательный метод) .
При желании вы можете переопределить StrictlyTypedCollectionInterfaceImplementationTrait::__construct(mixed ...$arr_objs) с помощью конструктора с той же сигнатурой, но определенного типа. Например, __construct(PDO ...$pdo_objs) гарантирует, что только экземпляры PDO могут быть внедрены в конструктор посредством распаковки аргументов.
В приведенном ниже примере кода показано, как можно реализовать пользовательский класс коллекции под названием PdoCollection , который хранит только элементы, являющиеся экземплярами PDO :
<?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);
}
}
Вы можете объявить свои пользовательские типизированные классы коллекций как окончательные , чтобы пользователи ваших классов не могли расширять их и тем самым обойти проверку типов, выполняемую во время создания и добавления элемента.
ПРИМЕЧАНИЕ. Если вы хотите хранить в коллекции только элементы, которые являются лишь экземплярами определенного класса или его подклассов, и не хотите создавать для этой цели собственный класс коллекции, просто используйтеSpecificObjectsCollection.
Словарь методов по категориям
Описания методов с примерами
Общие коллекции
Строго типизированные коллекции
Эквивалентность методов сбора данных Laravel
Если вы обнаружите какие-либо проблемы с документацией, отправьте сообщение о проблеме или запрос на вытягивание.