Я борюсь с битовыми масками (или это битовые поля?).Я не уверен, как это сделать.
Я хочу создать DirectoryFilterIterator, который принимает флаги того, что фильтровать.Я думал, что буду использовать эти биты для этого:
const DIR_NO_DOT = 1;
const DOT = 2;
const DIR = 3;
const FILE = 4;
Поскольку DOT
также считается DIR
, я бы хотел иметь возможность различать и эти два.Если я прав, я подумал, что что-то подобное может быть возможно следующим образом:
DirectoryFilterIterator::DIR & ~DirectoryFilterIterator::DOT
Другими словами, это должно отфильтровать DIR
, если это не DOT
.Но я полностью застрял в том, как заставить работать фильтрацию (в методе accept
):
class DirectoryFilterIterator
extends FilterIterator
{
const DIR_NO_DOT = 1;
const DOT = 2;
const DIR = 3;
const FILE = 4;
protected $_filter;
public function __construct( DirectoryIterator $iterator, $filter = self::DIR )
{
parent::__construct( $iterator );
$this->_filter = $filter;
}
public function accept()
{
$item = $this->getInnerIterator()->current();
return (
!( ( $this->_filter & self::DOT ) == self::DOT && $item->isDot() ) &&
!( ( $this->_filter & self::DIR ) == self::DIR && $item->isDir() ) &&
!( ( $this->_filter & self::FILE ) == self::FILE && $item->isFile() )
);
}
}
... особенно из-за всех отрицаний, которые я имею, я добрыйпотерянного.Как я могу заставить это работать должным образом?