一個集合包,可以擴展以實現諸如依賴注入容器、用於容納數據庫記錄的 RecordSet 對象、一袋 http cookie 或技術上可以循環且每個項目都可以使用數組訪問的任何項目集合之類的東西-訪問語法或物件屬性語法。
你可以:
該套件提供了可選的嚴格類型化的集合項目,並力求 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
您也可以透過實作VersatileCollectionsCollectionInterface並在此類別中使用VersatileCollectionsCollectionInterfaceImplementationTrait ,讓應用程式中的任何類別的行為與VersatileCollectionsGenericCollection完全相同。
如果您想要強制執行嚴格類型,此套件中提供了以下 Collection 類別:
若要實作僅包含特定類別實例的物件(例如PDO )的自訂集合,您的自訂集合類別必須遵守下列要求:
您的自訂集合類別必須實作VersatileCollectionsStrictlyTypedCollectionInterface目前包含以下方法:
$item
是預期類型,必須傳回 true,否則傳回 false您的自訂集合類別應使用VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait (其中包含VersatileCollectionsStrictlyTypedCollectionInterface中方法的實作)。如果您選擇不使用VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait ,那麼您將必須實作VersatileCollectionsStrictlyTypedCollectionInterface中指定的所有方法,並確保在新增項目或修改專案的每個方法中呼叫checkType(mixed $item)方法在集合中,例如offsetSet($key, $val) ,並在checkType(mixed $item)回傳 false 時拋出VersatileCollectionsExceptionsInvalidItemException例外。如果您在自訂集合類別中使用VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait ,但新增了同時向集合中新增項目或修改專案的新方法,則可以使用VersatileCollectionsStrictlyTypedCollectionInteruncImplementationTraectionInterface中提供的輔助方法[p來驗證項目(如果您正在驗證的項目類型錯誤,它將自動拋出異常;有關如何使用此幫助器方法的範例,請參閱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 集合法等價
如果您發現文件有任何問題,請提交問題或拉取請求。