حزمة مجموعة يمكن توسيعها لتنفيذ أشياء مثل حاوية حقن التبعية، أو كائنات RecordSet لسجلات قاعدة البيانات، أو حقيبة ملفات تعريف الارتباط http، أو من الناحية الفنية أي مجموعة من العناصر التي يمكن تكرارها والتي يمكن الوصول إلى كل عنصر منها باستخدام المصفوفة -بناء جملة الوصول أو بناء جملة خاصية الكائن.
أنت تستطيع:
توفر هذه الحزمة كتابة اختيارية صارمة لعناصر المجموعة وتسعى جاهدة لتغطية اختبار الوحدة بنسبة 100%.
عبر الملحن: (يتطلب PHP 7.4+ أو PHP 8.0+).
قم بالتبديل إلى الفرع 3.X لقراءة الوثائق الخاصة بالإصدار 3.X.
قم بالتبديل إلى الفرع 4.X لقراءة الوثائق الخاصة بالإصدار 4.X.
قم بالتبديل إلى الفرع 5.x لقراءة الوثائق الخاصة بالإصدار 5.x.
قم بالتبديل إلى الفرع الرئيسي لقراءة الوثائق الخاصة بالإصدار الأحدث.
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 في مثل هذه الفئات.
إذا كنت تريد فرض الكتابة الصارمة، فسيتم توفير فئات المجموعة التالية في هذه الحزمة:
لتنفيذ مجموعة مخصصة تحتوي فقط على كائنات تمثل مثيلات لفئة معينة (على سبيل المثال PDO )، يجب أن تلتزم فئة المجموعة المخصصة الخاصة بك بالمتطلبات التالية:
يجب أن تقوم فئة المجموعة المخصصة الخاصة بك بتنفيذ VersatileCollectionsStrictlyTypedCollectionInterface الذي يحتوي حاليًا على الطرق أدناه:
$item
من النوع المتوقع أو خطأ بخلاف ذلكيجب أن تستخدم فئة المجموعة المخصصة الخاصة بك VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait (الذي يحتوي على تنفيذ الأساليب في VersatileCollectionsStrictlyTypedCollectionInterface ). إذا اخترت عدم استخدام VersatileCollectionsStrictlyTypedCollectionInterfaceImplementationTrait ، فسيتعين عليك تنفيذ جميع الطرق المحددة في VersatileCollectionsStrictlyTypedCollectionInterface والتأكد من استدعاء الأسلوب checkType(mixed $item) في كل طريقة تضيف فيها عناصر إلى العناصر أو تعدلها في المجموعة مثل offsetSet($key, $val) ورمي استثناء VersatileCollectionsExceptionsInvalidItemException عندما يُرجع checkType(mixed $item) خطأ. إذا كنت تستخدم 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);
}
}
يمكنك إعلان فئات المجموعة المكتوبة المخصصة الخاصة بك على أنها نهائية حتى لا يتمكن مستخدمو فئاتك من توسيعها وبالتالي التحايل على فحص النوع الذي يتم فرضه في وقت الإنشاء ووقت إضافة العنصر.
ملاحظة: إذا كنت تريد فقط تخزين العناصر التي تعد مجرد مثيلات لفئة معينة أو فئاتها الفرعية في مجموعة ولا تريد إنشاء فئة مجموعة مخصصة لهذا الغرض، فما عليك سوى استخدام SpecifiqueObjectsCollection
مسرد الأساليب حسب الفئة
طرق الوصف مع الأمثلة
مجموعات عامة
مجموعات مكتوبة بدقة
معادلة طرق جمع Laravel
يرجى إرسال مشكلة أو طلب سحب إذا وجدت أي مشاكل في الوثائق.