我正在努力使用bitmasks(或者它是bitfields?)。我不知道该怎么办。
我想创建一个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() )
);
}
}
...特别是因为我所做的所有否定,我有点失落。我怎样才能让它正常工作?
答案 0 :(得分:1)
使用位掩码时,您需要将其值设置为2的幂。如果将DIR设置为3,则表示它与DIR_NO_DOT和DOT组合同义。
尝试将其值设置为以下内容:
const DOT = 1;
const DIR = 2;
const FILE = 4;
现在您可以检查项目是否为DIR而不是表达DIR & !DOT
的DOT。