59 lines
1.6 KiB
PHP
59 lines
1.6 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of the Symfony package.
|
||
|
*
|
||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Symfony\Component\Finder\Iterator;
|
||
|
|
||
|
/**
|
||
|
* This iterator just overrides the rewind method in order to correct a PHP bug,
|
||
|
* which existed before version 5.5.23/5.6.7.
|
||
|
*
|
||
|
* @see https://bugs.php.net/68557
|
||
|
*
|
||
|
* @author Alex Bogomazov
|
||
|
*/
|
||
|
abstract class FilterIterator extends \FilterIterator
|
||
|
{
|
||
|
/**
|
||
|
* This is a workaround for the problem with \FilterIterator leaving inner \FilesystemIterator in wrong state after
|
||
|
* rewind in some cases.
|
||
|
*
|
||
|
* @see FilterIterator::rewind()
|
||
|
*/
|
||
|
public function rewind()
|
||
|
{
|
||
|
if (\PHP_VERSION_ID > 50607 || (\PHP_VERSION_ID > 50523 && \PHP_VERSION_ID < 50600)) {
|
||
|
parent::rewind();
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$iterator = $this;
|
||
|
while ($iterator instanceof \OuterIterator) {
|
||
|
$innerIterator = $iterator->getInnerIterator();
|
||
|
|
||
|
if ($innerIterator instanceof RecursiveDirectoryIterator) {
|
||
|
// this condition is necessary for iterators to work properly with non-local filesystems like ftp
|
||
|
if ($innerIterator->isRewindable()) {
|
||
|
$innerIterator->next();
|
||
|
$innerIterator->rewind();
|
||
|
}
|
||
|
} elseif ($innerIterator instanceof \FilesystemIterator) {
|
||
|
$innerIterator->next();
|
||
|
$innerIterator->rewind();
|
||
|
}
|
||
|
|
||
|
$iterator = $innerIterator;
|
||
|
}
|
||
|
|
||
|
parent::rewind();
|
||
|
}
|
||
|
}
|