مرحباً بالجميع ، سوف أخبرك عن دراجتي الخاصة للعمل المريح مع الصفائف في PHP.
اكتب تلميح
ظهرت تلميحات الكتابة في PHP7 ، والتي سمحت لـ IDE بإجراء تحليل ثابت أفضل للشفرة ، تحسنت جودة الشفرة لدينا (أو تقول بشكل صحيح "
لقد تحسنت"؟).
بالطبع ، في السابق ، كان من الممكن لـ IDE أن تكتب تلميحًا في التعليقات الخاصة بالكود ، ولكن الآن أصبحت الأنواع جزءًا من الكود والآن أصبح من الممكن إعادة ضبط refactor ولا تخشى أن تنسى شيئًا ما في مكان ما (refactor بالطبع بمعنى إعادة تسمية الفئات والواجهات).
إلى جانب حقيقة أنه أصبح من الممكن تحديد نوع الإخراج ، أصبح من الممكن تحديد نوع وسيطة الإدخال.
ولكن إلى جانب الميزات اللطيفة ، فإن كتابة التلميح تفرض أيضًا مسؤوليات ، أي أن أنواع المتغيرات يجب أن تكون كما هو موضح في توقيع الطريقة.
إذا لم تقم بالتحقق من الأنواع ، فيمكنك الحصول على أخطاء في الأساليب والمُنشئين (الأخطاء في المصممين مشجعة بشكل خاص).
كتابة الشيكات يدويًا هي عملية شاقة ، فقد قررت تشغيل هذه الأعمال تلقائيًا ، ولكن ليس من خلال التحقق ، ولكن من خلال الإدلاء بالنوع المطلوب.
في عملي ، غالبًا ما أضطر إلى الكتابة من نقطة الصفر ، وعادةً ما تكون إما نماذج أولية ، أو موزعات ، أو ETLs لمصدر بيانات جديد ، في الواقع أيضًا محلل.
بالطبع ، أنت تعمل مع المصفوفات (على سبيل المثال ، عندما تقرأ من * .csv) ، يمكنك العمل مع قاعدة البيانات من خلال ORM ، لكن بالنسبة لمهامي فهي مرهقة للغاية ، ومن المريح بالنسبة لي أن أعمل مع قاعدة البيانات من خلال PDO ، مما يوفر لك البيانات مرة أخرى في المصفوفات. لا يعرف Bitrix "مفضل" كيفية إرجاع بيانات غير الموجودة في صفيف.
بغض النظر عن كيفية استرجاع البيانات من المصفوفات. لذلك كتبت غلافًا للعمل مع المصفوفات.
حتى لا تقوم بنسخ الشفرة من مشروع إلى آخر ، قمت بتصميم
الحزمة لـ Composer :
composer require sbwerewolf/language-specific
ValueHandler
كان مطلبي الأول هو معرفة النوع الذي أتلقاه دائمًا. قبل ذلك ، بالطبع ، لا يزال يتعين علينا الحصول على القيمة ، ربما من خلال الفهرس ، لذلك توصلنا إلى استنتاج أننا بحاجة إلى طريقة
get ().
والآن نحتاج إلى طرق للإرسال ، لا توجد أنواع كثيرة في PHP ، لقد حصلنا على الطرق التالية:
- int ()
- شارع ()
- منطقي ()
- مضاعفة ()
تظهر المصفوفات في بعض الأحيان ، لذلك يجب أن تكون للصفائف:
في بعض الأحيان تحتاج فقط إلى الحصول على العنصر كما هو:
في بعض الأحيان قد لا يكون هناك عنصر مع فهرس معين ، وبعد ذلك تحتاج إلى استخدام القيمة الافتراضية:
ArrayHandler
كان المطلب التالي هو أن تكون قادرًا على تبسيط الصفيف من قيمة واحدة إلى هذه القيمة بالضبط.
سأريك مثالاً من الوثائق:
$connection = new PDO ($dsn,$login,$password); $command = $connection->prepare('select name from employee where salary > 10000'); $command->execute(); $data = $command->fetchAll(PDO::FETCH_ASSOC); $names = new ArrayHandler($data); $result = $names->simplify(); echo var_export($result,true);
يمكنك بالطبع تشغيل الصفيف الذي سيتم إرجاعه من الطلب والقيام بهذه المهمة:
$response[] = $element[0];
ولكني لا أحبها كثيرًا ، فدعها تحدث تلقائيًا ، لذا ظهرت طريقة
التبسيط ().
حسنًا ، نظرًا لوجود برنامج التفاف على المصفوفة ، سنضيف طريقة للتحقق من وجود الفهرس -
has () ، إذا كنت تريد تجاوز عناصر المصفوفة ، فستساعد الطريقة ()
التالية .
قد يكون هذا قد توقف لأن مستوى الأتمتة قد وصل إلى مستوى مريح ، لكن في بعض الأحيان يجب أن أعمل مع مجموعة متداخلة من مجموعة متداخلة ، وأكثر ملاءمة بالنسبة لي أن أحصل على الفور على
ArrayHandler للصفيف الهدف ، لذلك أضفت طريقة
السحب () التي تُرجع
ArrayHandler للصفيف المتداخل .
يبدو مثل هذا:
$address = new ArrayHandler($item)->pull('metaDataProperty')->pull('GeocoderMetaData')->pull('Address')->asIs();
يمكنك بالطبع كتابة مثل هذا:
$address = $item['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address'];
، ولكن في عيني تموجات على عدد من الأقواس المربعة ، هو أكثر ملاءمة بالنسبة لي من خلال
سحب ().
المنطق العام
عندما يكون الكود متصلاً من الملحن ، يكون ملائماً للغاية ، إلا أنك تخلصت من الحاجة إلى نسخ اللصق ، فستحصل على مكتبتك بأمر واحد وهي دائماً في متناول اليد.
قبل إعداد الحزمة الخاصة بي ، نظرت إلى نظائرها ولم أجد شيئًا من هذا القبيل ، فهناك العديد من المشاريع التي تلتف ببساطة على صفيف ، وفي هذه المشاريع تقوم ببساطة بالالتفاف على العديد من أساليب العمل مع المصفوفات ، ولا يوجد أي نوع أمان في أي مكان.
من الواضح أن الكتابة (int) أو (bool) أمام الاسم المتغير بسيطة ومناسبة للجميع ولا يرى أي أحد سببًا في الإزعاج بمستودع منفصل لهذا الشيء.
ميزات المكتبة أوسع قليلاً من تلك الموضحة في المقالة ويمكن الحصول على مزيد من المعلومات
في الوثائق (README.md) .
PHP5 ليس من غير المألوف ، لذلك تحتوي المكتبة على إصدار منفصل لـ PHP5 ، ويختلف عن إصدار PHP7 باسم عدة طرق ، وبالطبع كل تلميحات الكتابة موجودة فقط في التعليقات.
يوجد إصدار من المكتبة لـ PHP7.2 ، وهو يختلف فقط في ظهور نوع القيمة المرجعة في توقيع
الكائن () طريقة - كائن.
الشفرة مغطاة بالكامل بالاختبارات ، لكن من حيث المبدأ لا يوجد شيء يمكن كسره :)
استخدام للصحة!
حالة استخدام أخرى
foreach ($featureMember as $item) { $pointInfo = extract($item); $info = new ArrayHandler($pointInfo); $address = $info->get('formatted')->default('')->str(); $longitude = $info->get('longitude')->default(61.402554)->double(); $latitude = $info->get('latitude')->default(55.159897)->double(); $undefined = !$info->get('formatted')->has(); $properties = ['longitude' => $longitude, 'latitude' => $latitude, 'address ' => $address ,'undefined'=>$undefined,]; $result = json_encode($properties); output($result); }
للبحث أثناء تصحيح الأخطاء في JSON حيث تكون الأرقام أرقامًا ، تكون القيم المنطقية منطقية ، وأنا أكثر متعة من مجرد سلاسل.

ماذا عنك؟