FilterIterator位掩码(或位域)
问题描述:
我正在努力与位掩码(或是位域?)。我不知道如何去做。FilterIterator位掩码(或位域)
我想创建一个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())
);
}
}
...尤其是因为所有的否定我已经回事,我有点失去。我怎样才能使这个工作正常?
答
使用位掩码时,需要将它们的值设置为2的幂。如果将DIR设置为3,则意味着它与DIR_NO_DOT和DOT的组合同义。
尝试这样它们的值设置为东西:
const DOT = 1;
const DIR = 2;
const FILE = 4;
现在你可以检查的项目是DIR而不是DOT与表达DIR & !DOT
。