0

我正在为位掩码(或者它是位域?)而苦苦挣扎。我不知道该怎么做了。

我想创建一个接受过滤内容标志的 DirectoryFilterIterator。我想我会使用这些位:

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

因为 aDOT也被认为是 aDIR我也希望能够区分这两者。如果我是正确的,我认为这样的事情应该是可能的:

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() )
        );
    }
}

...尤其是因为我一直在否定,我有点迷路了。我怎样才能让它正常工作?

4

1 回答 1

1

使用位掩码时,您需要将它们的值设置为 2 的幂。如果将 DIR 设置为 3,则意味着它是 DIR_NO_DOT 和 DOT 组合的同义词。

尝试将它们的值设置为如下所示:

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

现在您可以使用表达式检查项目是否是 DIR 但不是 DOT DIR & !DOT

于 2011-03-20T10:07:14.787 回答