Paket koleksi yang dapat diperluas untuk mengimplementasikan hal-hal seperti Kontainer Injeksi Ketergantungan, objek RecordSet untuk menyimpan catatan basis data, sekantong cookie http, atau secara teknis koleksi item apa pun yang dapat diulang dan itemnya masing-masing dapat diakses menggunakan array Sintaks -akses atau sintaks properti objek.
Anda dapat:
Paket ini menyediakan pengetikan item koleksi opsional yang ketat dan berupaya mencapai cakupan pengujian unit 100%.
Melalui komposer: (Membutuhkan PHP 7.4+ atau PHP 8.0+).
Beralih ke cabang 3.X untuk membaca dokumentasi versi 3.X.
Beralih ke cabang 4.X untuk membaca dokumentasi versi 4.X.
Beralih ke cabang 5.x untuk membaca dokumentasi versi 5.x.
Beralih ke cabang master untuk membaca dokumentasi versi terbaru.
composer require rotexsoft/versatile-collections
Jika Anda hanya ingin menyimpan item dengan tipe yang sama atau berbeda dalam suatu koleksi, Anda dapat menggunakan kelas GenericCollection seperti:
<?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
Anda juga dapat membuat kelas apa pun di aplikasi Anda berperilaku persis seperti VersatileCollectionsGenericCollection dengan mengimplementasikan VersatileCollectionsCollectionInterface dan menggunakan VersatileCollectionsCollectionInterfaceImplementationTrait di kelas tersebut.
Jika Anda ingin menerapkan pengetikan yang ketat, kelas Koleksi berikut disediakan dalam paket ini:
Untuk mengimplementasikan koleksi khusus yang hanya berisi objek yang merupakan turunan dari kelas tertentu (misalnya PDO ), kelas koleksi khusus Anda harus mematuhi persyaratan berikut:
Kelas koleksi khusus Anda harus mengimplementasikan VersatileCollectionsStrictlyTypedCollectionInterface yang saat ini berisi metode di bawah ini:
$item
adalah tipe yang diharapkan atau salah jika sebaliknyaKelas koleksi khusus Anda harus menggunakan VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait (yang berisi implementasi metode di VersatileCollectionsStrictlyTypedCollectionInterface ). Jika Anda memilih untuk tidak menggunakan VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait , maka Anda harus mengimplementasikan semua metode yang ditentukan dalam VersatileCollectionsStrictlyTypedCollectionInterface dan pastikan Anda memanggil metode checkType(mixed $item) di setiap metode tempat Anda menambahkan item atau memodifikasi item dalam koleksi seperti offsetSet($key, $val) dan throw an Pengecualian VersatileCollectionsExceptionsInvalidItemException setiap kali checkType(mixed $item) mengembalikan false. Jika Anda menggunakan VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait di kelas koleksi khusus Anda tetapi menambahkan metode baru yang juga menambahkan item atau mengubah item dalam koleksi, Anda dapat menggunakan metode pembantu isRightTypeOrThrowInvalidTypeException($item, $calling_functions_name) yang disediakan di VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait untuk memvalidasi item (itu akan secara otomatis memberikan pengecualian untuk Anda jika item yang Anda validasi adalah tipe yang salah; lihat VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait::offsetSet($key, $val) untuk contoh bagaimana metode pembantu ini harus digunakan).
Anda secara opsional dapat mengganti StrictlyTypedCollectionInterfaceImplementationTrait::__construct(mixed ...$arr_objs) dengan konstruktor dengan tanda tangan yang sama tetapi dengan tipe tertentu. Misalnya, __construct(PDO ...$pdo_objs) memastikan bahwa hanya instance PDO yang dapat dimasukkan ke dalam konstruktor melalui pembongkaran argumen.
Contoh kode di bawah ini menunjukkan bagaimana kelas koleksi khusus yang disebut PdoCollection , yang hanya menyimpan item yang merupakan turunan dari PDO , dapat diimplementasikan:
<?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);
}
}
Anda dapat mendeklarasikan kelas koleksi yang diketik khusus sebagai kelas final sehingga pengguna kelas Anda tidak akan dapat memperluasnya dan dengan demikian menghindari pemeriksaan tipe yang diterapkan pada waktu pembuatan dan waktu penambahan item.
CATATAN: Jika Anda hanya ingin menyimpan item yang hanya merupakan turunan dari kelas tertentu atau subkelasnya dalam sebuah koleksi dan tidak ingin membuat kelas koleksi khusus untuk tujuan itu, cukup gunakan SpesifikObjectsCollection
Glosarium Metode berdasarkan Kategori
Deskripsi Metode dengan Contoh
Koleksi Generik
Koleksi yang Diketik dengan Ketat
Kesetaraan Metode Pengumpulan Laravel
Silakan kirimkan masalah atau permintaan penarikan jika Anda menemukan masalah apa pun dengan dokumentasi.