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