?

Log in

No account? Create an account
tech

SPL DirectoryIterator и удаление директорий

Время от времени вылезают тонкости с тем, что директория не закрывается после пробегания по ней с помощью SPL-итераторов.

Довольно неочевидный вариант проявления эффекта описан в разделе багов на сайте php:
http://bugs.php.net/bug.php?id=42948

Но это не мой случай.

В моем случае вот такой код вызывал блокировку и не возможность удалить директорию

<?php
$it
=new DirectoryIterator($myDir);
foreach(
$it as $fileItem){
  if(
$fileItem->isFile() && preg_match('/^\d{3}.*\.php$/',$fileItem)) {
    
$this->migrations[]=(string) $fileItem;
  }
}

Всему виной явная подстановка значения итератора $fileItem в вызов функции preg_match. Казалось бы должно было сработать приведение к строковому виду и все. Но видимо где-то остается ссылка на объект и он не уничтожается по выходе из метода.

Простое присваивание решает проблему:

<?php
$it
=new DirectoryIterator($myDir);
foreach(
$it as $fileItem){
  
$fileName=(string) $fileItem;
  if(
$fileItem->isFile() && preg_match('/^\d{3}.*\.php$/',$fileName)) {
    
$this->migrations[]=$fileName;
  }
}

Comments