Каков порядок элементов файла по умолчанию в поисковике Symfony?

Следующий код возвращает разные результаты в двух средах (которые, однако, должны были быть как можно ближе друг к другу: одна и та же версия PHP и т. Д.)

В /var/www/html/project/vendor/package/path/to/some/folderкаталог содержит точно такой же набор файлов в обеих средах. Сами файлы туда положили composer.

      use Symfony\Component\Finder\Finder;

// Don't mind this. The real app uses an autoloading mechanism.
require __DIR__ . '/../vendor/symfony/finder/Finder.php';
require __DIR__ . '/../vendor/symfony/finder/SplFileInfo.php';
require __DIR__ . '/../vendor/symfony/finder/Iterator/FilterIterator.php';
require __DIR__ . '/../vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php';
require __DIR__ . '/../vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php';
require __DIR__ . '/../vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php';
require __DIR__ . '/../vendor/symfony/finder/Iterator/PathFilterIterator.php';
require __DIR__ . '/../vendor/symfony/finder/Iterator/FilenameFilterIterator.php';
require __DIR__ . '/../vendor/symfony/finder/Iterator/FileTypeFilterIterator.php';

$path = '/var/www/html/project/vendor/package/path/to/some/folder';
$path = Finder::create()->files()->followLinks()->name('/\.(php|inc|hh)$/')->in($path);

$iterator = $path->getIterator();
$iterator->rewind();
$current = $iterator->current();
echo $current->getRelativePathname();

Это не случайно. Результаты стабильны в единой среде. Но в любой среде отображается другое имя пути. Мне удалось отследить это до родного PHP: FilterIterator::rewind, но я не уверен, что здесь проблема с перемоткой.

1 ответ

Решение

Для компонента Finder не существует определенного порядка "по умолчанию".

Итератор Finder ( Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator) распространяется на ядро \RecursiveDirectoryIterator, который не определяет порядок по умолчанию (и не способ "установить" порядок). Таким образом, порядок не гарантированно определен или гарантирован. Он сильно зависит от системы и файловой системы, и на него не следует полагаться.

Если вам нужен надежный и последовательный порядок сортировки, просто используйте соответствующий sort*()методы в экземпляре Finder. Это приведет к тому, что результат будет заключен в SortableIterator при вызове getIterator(), и получите результаты в предсказуемом порядке.

Другие вопросы по тегам