FilterIterator位掩码(或位域)

时间:2011-03-20 09:47:23

标签: php bit-fields bitmask filter-iterator

我正在努力使用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() )
        );
    }
}

...特别是因为我所做的所有否定,我有点失落。我怎样才能让它正常工作?

1 个答案:

答案 0 :(得分:1)

使用位掩码时,您需要将其值设置为2的幂。如果将DIR设置为3,则表示它与DIR_NO_DOT和DOT组合同义。

尝试将其值设置为以下内容:

const DOT  = 1;
const DIR  = 2;
const FILE = 4;

现在您可以检查项目是否为DIR而不是表达DIR & !DOT的DOT。