Directoryiterator غير متناسقة+سلوك مرشح في PHP؟
سؤال
لقد كتبت برنامج نصي يستخدم فئة FilterIriterator التي تأتي من مكتبة PHP القياسية (SPL) وأحصل على إصدارات مختلفة من PHP 5.x :( هنا وظيفة القبول ():
public function accept()
{
$current = $this->current();
print_r($current);
return true;
}
و Heres ناتج عن PHP 5.3.1:
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.
[fileName:SplFileInfo:private] => .
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/..
[fileName:SplFileInfo:private] => ..
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.DS_Store
[fileName:SplFileInfo:private] => .DS_Store
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
و Heres ما أحصل عليه بنفس الرمز تحت PHP 5.2.5
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
هذا الأخير لديه إذن 755 على جميع الملفات. ما الأمر مع دات؟
المحلول
يبدو أن هذا على ما يرام في الواقع! تعمل طرق الاتصال على كائنات الدليل الفارغ على ما يبدو. القضايا التي كنت أواجهها في مكان آخر وكان لديها علاقة باستنساخ هذه الأشياء. يبدو أن PHP 5.3 استنساخ عميق بينما 5.2 لا يتم قتل جميع المراجع على كل تكرار (أو شيء من هذا القبيل). إنها فوضى قبيحة غير موثقة: تمتص PHP!
نصائح أخرى
من php.net:
- ملاحظة: اعتبارًا من PHP 5.3.0 ، لم يعد من الممكن تعطيل هذا الامتداد وبالتالي يتوفر دائمًا.
ربما يكون تكوين PHP 5.2.5 الخاص بك غير مكتمل/خاطئ إلى حد ما؟ هل لديك مجموعة سجلات الخطأ الخاصة بك لعرض التحذيرات؟ إذا لم يكن الأمر كذلك ، فقم بضبطه وقم بتشغيل الكود مرة أخرى لمعرفة ما إذا كان يرمي أي تحذيرات ...