يضيف PHP5 Iterator، وهو عبارة عن مجموعة من الواجهات الجاهزة التي تساعد في التنقل والتعامل مع هياكل البيانات الهرمية. وهذه إحدى الميزات الجديدة الأكثر إثارة للاهتمام في PHP5.
تعمل هذه التكرارات على تقليل التعليمات البرمجية المطلوبة لمعالجة شجرة مستندات XML أو مجموعة من الملفات بشكل كبير. يتم استخدام عدد كبير من التكرارات في PHP5، بما في ذلك ArrayIterator وCachingIterator وLimitIterator وRecursiveIterator وSimpleXMLIterator وDirectoryIterator.
يمكن لـ DirectoryIterator معالجة الملفات الموجودة في الدليل بسرعة وكفاءة. مع المزيد من الإبداع في عملية البرمجة، يمكن أيضًا استخدام DirectoryIterator لمعالجة أشجار الدليل المتداخلة بشكل متكرر. يمكن إنجاز كلتا المهمتين باستخدام بضعة أسطر فقط من التعليمات البرمجية، وهو ما يمثل تحسنًا كبيرًا مقارنةً بالنهج "القياسي".
معالجة دليل ذو مستوى واحد نبدأ أولاً بمهمة بسيطة: معالجة دليل ذو مستوى واحد. أدخل (أو انسخ) الكود التالي (القائمة أ)، وقم بتعديل مسار الدليل ليعكس التكوين المحلي:
القائمة A
<?php$it = new DirectoryIterator("/tmp/mystuff");foreach($it as $file) {if ( !$it->isDot()) {echo $file . كيف حدث هذا؟ يوفر DirectoryIterator واجهة محددة مسبقًا لإعادة صياغة محتويات الدليل؛ بمجرد أخذ عينة من موقع الدليل الهدف، يمكن معاملته كمصفوفة PHP قياسية، حيث يمثل كل عنصر ملفًا في الدليل. لاحظ أنه يستخدم طريقة isDot () لتصفية الدلائل "." و".." على التوالي.
التعامل مع أشجار الدليل المتداخلة إن التعامل مع شجرة الدليل المتداخلة بشكل متكرر أمر سهل تقريبًا. في هذه الحالة، يحتاج DirectoryIterator إلى التحقق من كل كائن يصادفه في الدليل أحادي المستوى لتحديد ما إذا كان ملفًا أم دليلاً. إذا كان دليلاً، فانتقل إلى مستوى أعمق للتحقق من محتوى المستوى التالي. قد يبدو هذا معقدًا للغاية، وكان يتطلب في الماضي عادةً أكثر من 15 سطرًا من التعليمات البرمجية.
ومع ذلك، مع PHP5، تحتاج فقط إلى اثنين من التكرارات الجديدة: RecursiveIterator وRecursiveIteratorIterator، اللذين يجمعان كل الميزات المذكورة أعلاه. راجع القائمة ب:
القائمة ب
<?php$it = new RecursiveDirectoryIterator("/tmp");foreach(new RecursiveIteratorIterator($it) as $file) {echo $file "n";}?>في هذا الوقت، أدخل النتيجة سيتم سرد كافة الملفات والدلائل الموجودة ضمن دليل البداية. وغني عن القول أن هذه الواجهة المضمنة العودية مريحة للغاية إذا كنت بحاجة إلى معالجة جميع الملفات ضمن مستوى دليل محدد - على سبيل المثال، ضغط شجرة الدليل بشكل متكرر أو تعديل أذونات المجموعة/المالك لسلسلة من الملفات المتداخلة.
تطبيق واقعي: طباعة شجرة دليل تعد طباعة شجرة دليل رسومية أحد التطبيقات الشائعة لتكرار الدليل. يعد استخدام Iterator للتعامل مع هذه المهمة أمرًا بسيطًا للغاية، لأن وثائق فئة Iterator تحتوي على فئة مثيل مكتوبة خصيصًا لهذا التطبيق. يوفر DirectoryTreeIterator (بفضل Marcus Boerger) تحسينات أخرى على RecursiveIteratorIterator الذي تمت مناقشته سابقًا، ولا سيما علامات ASCII التي تمثل العمق والموضع في بنية الشجرة.
توضح القائمة C استخدام DirectoryTreeIterator.
القائمة C
<?php$it = new DirectoryTreeIterator("/tmp/cookbook/");foreach($it as $path) {echo $path "n";}?>هذا جزء من الإخراج الذي تراه:
| -ch01|.|-example01.php|.|-example01.php| لفهم قيمة DirectoryIterators بشكل أفضل، حاول ترميز التطبيقات الثلاثة الموضحة في هذا البرنامج التعليمي باستخدام وظائف الملف والدليل القياسية.